1.多态的基本概念
多态分为两类:
静态多态:函数重载 和 运算符重载属于静态多态,复用函数名
动态多态:派生类和虚函数实现运行时多态
静态多态和动态多态的区别:
静态多态的函数地址早绑定——编译阶段确定函数地址
动态多态的函数地址晚绑定——运行阶段确定函数地址
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include
2.动态的原理剖析
3.多态案例一 计算器类
多态的优点:
代码组织结构清晰
可读性强
利于前期和后期的扩展以及维护
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include
4.纯虚函数和抽象类
多态中,通常父类中虚函数的实现毫无意义,主要都是调用子类的内容
因此可以将虚函数改为纯虚函数
语法:virtual 返回值类型 函数名 (参数列表) =0;
当类中有了纯虚函数,这个类也成为抽象类
抽象类特点
无法实例化对象
子类必须重写抽象类中的纯虚函数,否则也属于抽象类
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include
5.多态案例二 制作饮品
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include
6.虚析构和纯虚析构
多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的虚构代码
解决方式:将父类中的析构函数改为虚析构或者纯虚析构
虚析构和纯虚析构共性:
1.可以解决父类指针释放子类对象
2..都需要有具体的函数实现
虚析构和纯虚析构区别:
如果是纯虚析构,该类属于抽象类,无法实例化对象
虚析构语法:
virtual ~类名(){}
纯虚析构语法:
virtual ~类名()=0;
类名::~类名(){}
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include
总结:
1.虚析构或纯虚析构就是用来解决父类指针释放子类对象
2.如果子类中没有堆区数据,可以不写虚析构或纯虚析构
3.拥有纯虚析构的类也属于抽象类
7.多态案例三 电脑组装
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include