C++多态 --- 多态实现原理简析
Posted Overboom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++多态 --- 多态实现原理简析相关的知识,希望对你有一定的参考价值。
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> 当父类的指针或引用指向子类对象时,发生多态
以上是关于C++多态 --- 多态实现原理简析的主要内容,如果未能解决你的问题,请参考以下文章
C++之多态总结(多态的定义及实现,抽象类,多态原理,单继承,多继承中的虚函数表)
C++进阶第十六篇——C++中的多态(多态的概念+多态的实现+抽象类+多态的原理)