多态性和虚函数

1.什么是多态性?

多态性(c++中虚函数实现)是面向对象程序设计语言中数据抽象和继承之外的第三个基本特征。它是同一个事物在不同场景下的多种形态。例如c++中的可以定义同名函数实现不同的功能。
c++中多态分为静态多态和动态多态。静态多态是程序在编译期间就完成函数调用,例如函数重载和泛型编程;动态多态在程序执行期间判断所引用对象的实际类型,根据其实际类型调用相应的方法,例如虚函数。

2.虚函数

使用virtual关键字修饰类的成员函数时,指明该函数为虚函数,派生类需要重新实现,编译器将实现动态绑定。只在含有virtual函数的基类的地址时发生。当调用虚函数时,程序将动态的不同的对象。看代码:

class Fruitcolor
{
public:
    void AppleColor()
    {
        cout<<"Apple:read"<<endl;
    }
    void PearColor()
    {
        cout<<"Pear:yellow"<<endl;
    }

};

class Fruit
{
public:
    virtual void GetFruitColor(Fruitcolor &_fc)=0;//定义虚函数
};

class Apple:public Fruit
{
public:
    virtual void GetFruitColor(Fruitcolor &fc)
    {
        fc.AppleColor();
    }
};

class Pear:public Fruit
{
public:
    virtual void GetFruitColor(Fruitcolor &fc)
    {
        fc.PearColor();
    }
};

void FunTest()
{
    Fruit *p_apple,*p_pear;//
    p_apple = new Apple;
    p_pear = new Pear;
    Fruitcolor fc;

    p_apple->GetFruitColor(fc);//输出apple的color
    p_pear->GetFruitColor(fc);//输出pear的color

    delete p_apple;
    p_apple = NULL;
    delete p_pear;
    p_pear = NULL;
}

可以看到,Apple类和Pear类对Fruit类的GetFruitColor()虚函数进行了重写,在FunTest()函数里定义两个基类的指针p_apple和p_pear,使他们指向不同的派生类对象Apple和Pear,当不同的指针分别调用GetFruitColor()虚函数时,分别得到了苹果的颜色和梨的颜色。

注意:

  • 仅仅在声明时需要使用关键字virtual,定义时并不需要。
  • 如果一个函数在基类中被声明为virtual,那么在所有派生类中都是virtual的,不过建议在派生类标名virtual避免和其他函数混乱。
  • 在派生类中重新定义虚函数,要求函数名,函数类型,参数个数和类型完全与基类中的虚函数相同,根据自己的需求定义函数体。
  • 如果在派生类中没有对虚函数重新定义,则派生类简单的继承基类的虚函数。
  • 只能将类的成员函数声明为虚函数,不能将普通函数声明为虚函数。
  • 一个成员函数被声明为虚函数后,就不能再同一类族中再定义一个非virtual的但是与虚函数首部相同的函数。
  • 一般将析构函数声明为虚析构函数,即时基类不需要析构函数,也要显示的定义一个函数体为空放入虚析构函数,以保证在撤销对象动态分配空间时能得到正确的处理。
  • 只有成员函数和基可以是虚函数,构造函数,static修饰的成员函数,友元函数都不能为虚函数。

纯虚函数和抽象类

纯虚函数:
有时在类中将某一成员声明为虚函数,并不是因为基类本身的要求,而是因为派生类的需求,在基类中预留一个函数名,具体功能留给派生类区定义。这种情况下就可以将这个纯虚函数声明为纯虚函数。其一般形式是:
virtual 函数类型 函数名 (参数列表) =0;
注意:
纯虚函数没有函数体。最后的“=0”只是一种形式,告诉编译系统,它是一个纯虚函数,留在派生类中定义,并没有实际意义。纯虚函数只有在派生类中定义了之后才能被调用。如果在一个类中声明了纯虚函数,而在派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数。
抽象类:
含有纯虚函数的类就成为抽象类。抽象类只是一种基本的数据类型,用户需要在这个基础上根据自己的需要定义处各种功能的派生类。抽象类的作用就是为一个类族提供一个公共接口。抽象类不能定义对象,但是可以定义指向抽象类的指针变量,通过这个指针变量可以实现多态。
例如上面代码中的Fruit类就是一个抽象类,Fruit类里面的函数是纯虚函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值