C++多态
一、多态分类
分为:静态多态 --> 函数重载和运算符重载
动态多态 ---> 派生类和虚函数实现运行时多态
父类中同名函数定义虚函数 --> 子类中的同名函数才能实现自己的功能 ----->> 属于地址晚绑定 在运行阶段才进行地址绑定
父类中同名函数不定义虚函数 --> 子类中的同名函数不能实现自己的功能 ----->> 属于地址早绑定 在编译阶段才进行地址绑定
二、动态多态满足条件
1、有继承关系
2、子类重写父类中的虚函数
重写定义 -->> 1、函数返回值类型 2、函数名 3、参数列表 这三点完全相同
动态多态的使用 -------》》 父类指针或引用指向子类对象
例: Animal * a = new Cat; Animal是父类 Cat是子类
三、多态的底层原理
父类的内部结构 --》 包含vfptr ---》》 vfptr指向vftable ----》》》vftable记录着虚函数地址
vfptr:虚函数指针
vftable:虚函数表
v ---- virtual
f ---- function
ptr ---- pointer
table ---- table ---表
子类的内部结构与父类相同
当子类重写父类中的虚函数时----子类从父类中继承的虚函数表中的虚函数地址会被替换成子类重写的虚函数的地址-----(专业术语:覆盖);
四、实际开发中多态好处:
1、组织结构清晰
2、可读性强
3、对于前期和后期扩展以及维护性高
c++开发提倡利用多态设计程序架构
五、纯虚函数和抽象类
由于在多态中,通常父类的虚函数的实现毫无意义,因此可以写成纯虚函数。
纯虚函数语法: virtual 返回值类型 函数名 (参数列表)= 0 ;
当有了纯虚函数,类就成为抽象类
抽象类特点:
1、无法实例化对象
2、子类必须重写抽象类中的纯虚函数,否则也属于抽象类。