分享

C++多态实现原理 (虚函数和动态绑定)

 GLL_ 2018-05-30
 
 


​1)编译器会为包含虚函数的类生成一张虚函数表,用来存放每个虚函数地址,简称虚表,每个虚函数都对应虚函数表中的索引号。

2)同时会增加一个隐式的成员变量,用于存放虚表的地址,该变量称为虚函数表指针,简称虚指针(vptr);

3)所谓的虚函数覆盖,本质就是用子类中的虚函数的地址覆盖基类虚表中对应基类虚函数的地址

4)当编译器看到通过指针或引用调用虚函数时,不会直接生成函数调用的语句,而是用一段代码来替换该语句,这段代码在运行阶段被执行,完成如下功能:

  --》确定指针或引用的目标对象的真实类型,并找到虚指针

  --》根据虚指针找到相应的虚函数表,并从中获取调用虚函数的入口地址

  --》根据函数入口地址执行虚函数代码

  这个函数绑定或称发生在程序的运行阶段,因此被称为动态绑定。

动态绑定对程序性能影响

1)动态绑定会增加内存开销

2)虚函数调用会增加时间的开销

3)虚函数不能被内联优化

注:如果没有多态的语法要求,最好不要使用虚函数

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多