1. 多态分类
多态分为两类
静态多态和动态多态区别:
- 静态多态的函数地址早绑定 - 编译阶段确定函数地址
- 动态多态的函数地址晚绑定 - 运行阶段确定函数地址
2. 动态多态的满足条件
1. 有继承关系
2. 子类重写父类中的虚函数
动态多态使用条件
父类指针或引用指向子类对象
3. 多态实现的前提
赋值兼容规则是指在需要父类对象的地方可以使用子类对象来代替:
通过public继承,子类得到了父类除构造/析构函数之外的所有成员,且所有成员的访问属性和父类的完全相同。这样,public继承的子类实际就具备了父类的所有功能,凡是父类能解决的问题,子类都可以解决。
赋值兼容规则是发生在父类和子类之间的:
(1) 子类的对象可以赋值给父类对象对象,过程会发生隐式类型转换
(2) 父类类型的指针可以指向子类对象
(3) 父类类型的引用可以用子类对象初始化
发生赋值兼容后,子类对象只能被作为父类对象使用,即只能使用从父类继承而来的成员。
4. 多态实现原理简析
以【C++】 --- 多态问题抛出与virtual关键字中的code为例讲解:
没有加virtual关键字时,sizeof(Animal)输出值为1,加了virtual关键字之后sizeof(Animal)输出值为4。Cat继承Animal类之后,其大小也是4.
是因为这时候类内部有一个指针vfptr [v - virtual, f - function, ptr - pointer],通过下面一个图进一步理解:
1> 当子类重写父类的虚函数,子类中的虚函数表 内部 会替换成 子类的虚函数地址
2> 当父类的指针或引用指向子类对象时,发生多态