目录
多态的概念
我们把具有继承关系的多个类型称为多态类型,因为我们能使用这些类型的“多种形式”而无须在意它们的差异。去完成某个行为,当不同的对象去完成时会产生出不同的状态。
重写(覆盖)
虚函数的重写(覆盖),派生类中有一个跟基类完全相同的虚函数(派生类虚函数返回值、名字、参数完全相同),重写派生类虚函数内容。
class Person{
public:
virtual buy()
{cout<<"Person::buy()<<endl;}
};
class Student{
public:
virtual buy()
{cout<<"Student::buy()"<<endl;}
};
形成多态的两个条件
1、必须通过基类的指针或者引用调用虚函数。
2、被调用的必须是虚函数,且派生类必须对基类的函数进行重写。
C++关键词final与override
final:修饰虚函数,表示该虚函数不能再被重写。
override: 检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错。
抽象类
抽象类的概念
在虚函数后面加上=0,内这个函数为纯虚函数。包含纯虚函数的类叫抽象类。抽象类不能实体化对象,派生类继承后也不能实体化出对象,只能对虚函数进行重写。纯虚函数规定了派生类必须重写,体现接口继承的概念。
接口继承与实现继承
普通函数的继承为实现继承,派生类继承了基类函数,可以使用函数。接口继承为虚函数继承,继承接口,重写函数内容,实现多态。
多态的原理
虚函数表(_vfptr)
一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中,虚函数表也简称虚表。
虚函数表的本质是一个存虚函数指针的指针数组,指针数组最后存放一个nullptr。
派生类的虚表生成:a.先将基类中的虚表内容拷贝一份到派生类虚表中 b.如果派生类重写了基类中某个虚函数,用派生类自己的虚函数覆盖虚表中基类的虚函数 c.派生类自己新增加的虚函数按其在派生类中的声明次序增加到派生类虚表的最后。