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++之多态总结(多态的定义及实现,抽象类,多态原理,单继承,多继承中的虚函数表)

C++进阶第十六篇——C++中的多态(多态的概念+多态的实现+抽象类+多态的原理)

9-3:C++多态之多态的实现原理之虚函数表,虚函数表指针静态绑定和动态绑定

C++程序设计POJ》《WEEK6 多态与虚函数》《多态的实现原理》《虚函数表》