1.多态的基本概念
分为两类
静态多态:函数重载和运算符重载属于,复用函数名
动态多态:派生类和虚函数实现运行时多态
区别
静态多态的函数地址早绑定,编译阶段确定函数地址
动态多态的函数地址晚绑定,运行阶段确定函数地址
父类成员函数前面加virtual 叫做虚函数,就会实现动态多态
class Animal{ virtual speak()};
class Cat:public Animal{ speak()};
class Dog:public Animal{ speak()};
动态多态满足条件
有继承关系
子类要重新写父类的虚函数(重写:返回值类型,函数名,参数表完全相同)
使用 用父类的引用或者指针执行子类对象
vsptr 虚函数(表)指针,指向一个虚函数表vftable
子类重写父类的虚函数时,子类中的虚函数表内部会替换成子类的虚函数地址
当父类的指针或者引用子类对象时,就会发生多态
2.多态的优点
代码组织结构清晰
可读性强
利于前期和后期的扩展和维护
开发中提倡开闭原则
对扩展进行开发,对修改进行封闭
3.纯虚函数和抽象类
在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容,因此可以将虚函数改为纯虚函数
语法 virtual 返回值类型 函数名 (参数表) = 0;
当类中有了纯虚函数,这个类也称为抽象类
抽象类特点
无法实例化对象(不能用这个类建立新的对象)
子类必须重写抽象类中的纯虚函数,否则也属于抽象类
4.虚析构和纯虚析构
使用多态时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码
解决方法 将父类中析构函数改为虚析构或者纯虚析构
虚析构和纯虚析构
共性:
可以解决父类指针释放子类对象
都需要有具体的函数实现
区别
如果是纯虚析构,该类属于抽象类,无法实例化对象
纯虚析构函数需要声明,也需要在类外实现
有了纯虚析构,这个类也属于抽象类,无法实例化对象
虚析构语法 virtual ~类名(){}
纯虚析构语法 virtual ~类名()=0;//声明
类名::~类名(){} //实现
总结
虚析构或者纯虚析构就是用来解决父类指针在释放子类对象
如果子类中没有堆区数据,可以不写为虚析构或者纯虚析构
有了纯虚析构,这个类也属于抽象类,无法实例化对象
标签:函数,对象,子类,多态,抽象类,父类,纯虚析构 From: https://blog.csdn.net/weixin_62492456/article/details/140264445