虚继承的内存分布

虚继承区别于普通继承,就是普通继承的基类的内存在开始位置,而虚继承的共享基类内存在最后,而虚继承的子类,需要知道共享基类的偏移量,所以,虚继承导致子类的大小增加一个指针大小,即多了一个vbptr(虚基类指针)。

vbptr指向一个vbtable,第一个整数表示类起始位置偏移量,第二个整数表示虚继承的共享基类偏移量。

内存分布上,vbptr在类的成员属性之前,vfptr(虚函数表)之后。

如果类存在vfptr(虚函数表),那个vbtable的第一个整数就是负数,否则就是0,也就是类的内存开始就是vbptr。

在64位虚拟机虚继承内存分布与32位系统是不同的。在虚继承,类的虚函数表指针(vptr)会被放置在派生类对象的内存布局。对于虚基类,派生类对象会有一个指向虚基类子对象的偏移量指针(vbptr)。 下面是一个简单的示例,假设我们有如下的虚继承关系: ``` class Base { public: virtual void foo() {} }; class VirtualBase { public: virtual void bar() {} }; class Derived : public virtual Base, public virtual VirtualBase { public: virtual void baz() {} }; ``` 在派生类 `Derived` 内存布局如下: ``` +-------------+ | vptr to B | // 指向 Base 类的虚函数表 +-------------+ | vptr to VB | // 指向 VirtualBase 类的虚函数表 +-------------+ | vbptr | // 指向虚基类子对象的偏移量指针 +-------------+ | Base subobj | // 虚基类子对象 +-------------+ | Derived obj | +-------------+ | VirtualBase subobj | // 虚基类子对象 +-------------+ ``` 可以看到,派生类对象包含了两个虚函数表指针,一个指向 `Base` 类的虚函数表,另一个指向 `VirtualBase` 类的虚函数表。同时,派生类对象还有一个指向虚基类子对象的偏移量指针(vbptr),以及虚基类子对象本身。最后是 `Derived` 对象本身。 需要注意的是,在64位系统,指针的大小通常为8字节,因此虚函数表指针和偏移量指针的大小都为8字节。而在32位系统,指针的大小通常为4字节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值