一、多态的基本概念
多态分为静态多态和动态多态
前置例如函数重载和运算符重载,后者例如派生,虚函数运行时多态
区分点
前者函数地址编译阶段绑定,早。
后者函数地址运行阶段绑定,晚。
动态多态满足条件
1.有继承关系
2.子类要重写父类重的虚函数virtual (函数类型)(函数名){};
(重写意味着 函数返回值类型 函数名 参数列表 完全相同)
动态多态的使用
父类的指针或引用 指向子类对象
当写虚函数后,类的内部发生改变,多了一个虚函数指针vfpt,它指向一个虚函数表vftable,虚函数表内部记录了虚函数的函数入口地址,当子类重写虚函数,他会把父类继承过来的虚函数表记录内容改掉,替换成子类函数入口。当你用父类引用指向子类对象时,由于你本身依然是子类对象,所以当你调用公共接口它会从子类中找到重写后的函数接口
二、多态实际应用一
分别应用算法和多态技术实现两个操作数进行运算的计算器类
父类只提供操作数和端口
子类辅助加减乘除
开闭原则:
对扩展进行开放,对修改进项关闭
多态优点:
>代码组织结构清晰
>可读性强
>利于前期后期的拓展与维护
三、纯虚函数和抽象类
因为再多态中,通常父类中的虚函数的实现是毫无意义的,主要都是调用子类重写的内容,因此可以将函数改为纯虚函数
语纯虚函数法
virtval 返回值类型 函数名 (参数列表)= 0;
当类中有了纯虚函数,这个类也称为抽象类
抽象类特点:
>无法实例化对象
>子类必须重写抽象类中的虚函数,否则也属于抽象类
四、多态实际应用二
利用多态技术是实现本案例,提供抽象制品饮品父类,提供子类制作咖啡和茶叶
五、虚析构和纯虚析构
解决多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码,方法是将父类中的析构函数改为虚析构或者纯虚析构
虚析构和纯虚析构的共性:
>可以解决父类指针释放子类对象
>都需要有具体的函数实现
虚析构和纯虚析构的区别:
>如果是纯虚析构,该类属于抽象类,无法实例化对象