c++多态之——vptr指针

之前做过一个测试,在一个类中定义一个virtual修饰的函数时,sizeof这个类,发现类的大小多了恰好一个指针的字节大小,当初不明白,只是记住有这么一个特性。后来,发现它就是c++编译器给我们添加的vptr指针。

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

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

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

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

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

在实现多态的过程中,父类和派生类都有vptr指针。

 

对象中的vptr指针什么时候被初始化:

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

只有当对象的构造完全结束后vptr的指向才最终决定下来;

父类对象的vptr指向父类的虚函数表,子类对象的vptr指向子类的虚函数表。

定义子类对象时,vptr先指向父类的虚函数表,在父类构造完成之后,子类的vptr才指向自己的虚函数表。(这也就是在父类或者子类的构造函数中调用虚成员函数不会实现多态的原因,这是一道面试题)

 

原文链接: https://www.cnblogs.com/yangguang-it/p/6547314.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    c++多态之——vptr指针

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/250798

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午4:48
下一篇 2023年2月14日 上午4:48

相关推荐