C++虚函数表机制

C++虚函数表机制

虚函数对类对象内存分布的影响
class Base1
{
public:
    int base1_1;
    int base1_2;

    virtual void base1_fun1() {}
};

当类中添加一个虚函数后,类对象的成员变量base1_1和base1_2相对于没有虚函数时,地址会向后偏移4。原因在最前端添加了一个虚函数表指针,指向虚函数表。当类中有多个虚函数时,类的大小以及成员变量的地址偏移量并不会改变,因为虚函数时被添加到了虚函数表中,并不会改变类对象的大小。
同一个类的不同实例,使用同一份虚函数表。

继承有虚函数的基类
  1. 单继承
    在单继承中,含有虚函数的基类在上面,继承类的成员在下面,如果派生类没有虚函数,基类的内存布局不会发生任何变化,继承类对基类进行虚函数覆盖时,继承类会重写所覆盖的基类虚函数表中的虚函数,定义基类中没有的虚函数的单继承的类,继承类的虚函数会被加到虚函数表的后面,但是基类并不知道,也不会对基类产生影响,如果基类没有虚函数而派生类多出来一个虚函数呢?,这个时候会为派生类创建一个虚函数表指针放在最前面。
  2. 多继承
    如果继承的两个基类中,一个有个虚函数,一个没有虚函数,派生类中自定义虚函数的话,谁有虚函数就将谁放到前面,将派生类的虚函数追加到虚函数表的后面,如果两个基类都没有虚函数,会为派生类专门创建一个虚函数表指针。如果继承的类是三个,有,没有,有函数表,会将有虚函数表的放到前面,派生类的虚函数会追加到第一个有虚函数表的表后面。

详细内容请参考C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值