多态
概念
父类的引用或指针指向子对象(动态多态要使用虚函数)
分类
●静态多态:函数重载
静态联编:地址早绑定,编译阶段绑定好地址,不能根据对象决定调用的函数
●动态多态:虚函数(父类使用虚函数,发生了多态,子类必须重写虚函数)
动态联编:地址晚绑定,运行时候绑定好地址
原理
父类中有虚函数后,内部结构就发生了改变,多了一个vfptr(虚函数指针)指向vftable(虚函数表)
子类会继承父类的vfptr和vftable(不是同一个,构造函数中会将虚函数表指针指向自己的虚函数表)
子类重写(不是重载,重写所有东西都一样)会替换掉虚函数表原有的父类函数,改为子类的函数
深入剖析
内部调用:
作用——计算器案例
开发原则:开闭原则,对扩展开放,对修改关闭
早期方法:计算器类成员函数有加减,后期加乘除功能需要修改代码,不方便
多态实现:抽象计算器类,用加计算器类和减计算器类继承它,扩展的话新建乘类就很方便
抽象类和纯虚函数
●纯虚函数:virtual void func() = 0;
●抽象类:类中有纯虚函数,不可以实例化对象。如果类继承了抽象类,必须重写抽象类中的纯虚函数
虚析构和纯虚析构
●虚析构:virtual ~类名() {}
解决问题:父类指针指向子类对象时候可以调用子类析构函数
●纯虚析构:virtual ~类名() = 0
用法:类内声明,类外实现
注意:出现了纯虚析构函数,类算抽象类,不能实例化对象
向上类型转换和向下类型转换
注意:派生类中有基类中不具备的特性
●基类转派生类:向下,不安全
●派生类转基类:向上,安全
●多态:父类的引用或指针指向子类对象,因为new的是派生类,所以安全