多态分为两类:
- 静态多态:函数重载和运算符重载属于静态多态,复用函数名。
- 动态多态:派生类和虚函数实现运行时多态
静态多态和动态多态的区别:
- 静态多态的函数地址早绑定-编译阶段确定函数地址
- 动态多态的函数地址晚绑定-运行阶段确定函数地址
动态多态满足条件:
有继承关系
子类 重写父类的虚函数
动态多态的使用:父类的指针或者引用执行子类对象
空类占1字节
多态好处:代码组织结构清晰,可读性强,利用前期和后期扩展以及维护
纯虚函数和抽象类:多态中,父类中的虚函数 的实现通常是无意义的,主要是调用子类写的内容。
因此可将虚函数改为纯虚函数。
纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0;
当类中有了纯虚函数,这个类也叫做抽象类。
抽象类特点: 无法实例化对象,子类必须重写抽象类中的纯虚函数,否则也属于抽象类。
虚析构和纯虚析构:多态使用时,如果子类中 有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码。
解决方法是:将父类中的析构函数改为 虚析构和纯虚析构。
虚析构和纯虚析构共性:可以解决父类指针释放子类对象; 都需要具体的函数实现,
区别: 如果是纯虚析构,该类属于抽象类,无法实例化对象。
虚析构语法:virtual ~类名(){}
纯虚析构语法:virtual ~类名()=;
类名::~类(){}
如果子类中没有堆区数据,可以不写虚析构或纯虚析构
拥有纯虚析构函数的类也属于抽象类。(无法实例化对象)