码迷,mamicode.com
首页 > 编程语言 > 详细

C++多态的实现原理

时间:2018-04-21 17:46:44      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:生成   c++   条件   虚函数   子类   父类   对象类型   分享   对象   

多态的实现效果

  同样的调用语句有多种不同的表现形态

多态实现的三个条件

        有继承、有virtual重写、有父类指针(引用)指向子类对象。

多态的C++实现

  通过在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。

C++中多态的实现原理

  当类中声明虚函数时,编译器会在类中生成一个虚函数表

虚函数表是一个存储类成员函数指针的数据结构

虚函数表是由编译器自动生成与维护的

virtual成员函数会被编译器放入虚函数表中

存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针)

 

技术分享图片

技术分享图片

 

 

技术分享图片

说明1

  通过虚函数表指针VPTR调用重写函数是在程序运行时进行的,因此需要通过寻址操作才能确定真正应该调用的函数。而普通成员函数是在编译时就确定了调用的函数。在效率上,虚函数的效率要低很多。

说明2

  出于效率考虑,没有必要将所有成员函数都声明为虚函数

对象中的VPTR指针什么时候被初始化?

对象在创建的时,由编译器对VPTR指针进行初始化

只有当对象的构造完全结束后VPTR的指向才最终确定

父类对象的VPTR指向父类虚函数表

 

子类对象的VPTR指向子类虚函数表

故我们可以知道构造函数调用虚函数不能实现多态。

说明1

通过虚函数表指针VPTR调用重写函数是在程序运行时进行的,因此需要通过寻址操作才能确定真正应该调用的函数。而普通成员函数是在编译时就确定了调用的函数。在效率上,虚函数的效率要低很多。

说明2

出于效率考虑,没有必要将所有成员函数都声明为虚函数

C++多态的实现原理

标签:生成   c++   条件   虚函数   子类   父类   对象类型   分享   对象   

原文地址:https://www.cnblogs.com/bbujing/p/8901896.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!