当类之间存在多种层次结构,并且类之间通过继承关联时就会用到多态。
虚函数在子类中的覆盖版本和该函数在基类中的原始版本必须有相同的函数签名、函数名、形参名、常属性。如果返回值为非类类型,则必须相同,如果是类类型A的指针或者引用,允许子类的覆盖版本返回A子类的的指针或者引用。
C++多态意味着调用成员函数时会根据函数的对象的类型来执行不同的函数。
使用多态以后就可以通过基类的指针来指向不同的派生类来实现函数的多态。
使用方式为在基类需要实现多态的函数的修饰符中加入virtual
。如果没有virtual
我们使用基类的指针只能访问到基类的方法。
想要了解更多关于基类指针指向派生类的问题可以看我的另一篇文章:传送门
使用virtual
修饰的函数称为虚函数,不同于一般函数的静态绑定,虚函数使用的时动态链接(后期绑定)
如果我们并不想在基类中实现虚函数(可能因为不会用到之类的原因),可以将虚函数声明为纯虚函数(接口),格式如下:
class A
{public://virtual void func(){}virtual void func() = 0;//==0告诉编译器,函数没有主体,这是一个纯虚函数
};
包含纯虚函数的类叫做抽象类,**抽象类不能被实例化,但可以定义指针。**虚函数还是需要实现的,如果不想写可以写成{}
当用基类指针指向派生类对象在动态分配堆上内存的时候,析构函数必须是虚函数!!!
友元函数不是成员函数,因此不能虚拟。
父类的虚函数或纯虚函数在子类中仍然是虚函数,有时我们不希望父类的某个函数在子类中被重写,在C++11后的版本可以使用final
(放在函数声明之后,函数体之前)来避免被重写,如果不希望一个类被继承也可以用final
关键字(放在类声明之后类体之前)