多态的类型
- 静态多态:函数重载和运算符重载,静态多态编译阶段确定函数地址
- 动态多态:派生类和虚函数实现的运行时多态,动态多态运行时阶段确定函数地址
动态多态的原理
在虚函数中,函数的地址通过 vfptr 来标记。子类会继承 vfptr 并指向不同的函数
- (带虚函数的)父类:vfptr -> vftable: &Base::func()
- (重写虚函数)子类:vfptr -> vftable: &Son::func()
动态多态的实现
- 有继承关系
- 子类重写父类中的虚函数(函数前加 virtual 关键字)
动态多态的使用
父类的引用或指针指向子类的对象
纯虚函数和抽象类
virtual int getResult() = 0; // 后面带 = 0 的即为纯虚函数
带有纯虚函数的类被称为抽象类,抽象类的特点是:
- 无法实例化对象
- 子类必须重写抽象类中的虚函数,否则仍然是抽象类
纯虚析构
使用析构时,如果子类中属性开辟到堆区,那么父类的指针将无法调用子类的析构
此时应将父类析构改成虚析构或纯虚析构
- 纯虚析构必须要有实现
- 带纯虚析构的类也是抽象类