C++中虚继承的vtordisp

今天在复习虚函数的时候,看到很多博客上写虚继承的子类时,没有添加构造函数,所以sizeof相对基类多了4

于是自己在写的时候添加了构造函数,却发现字节多了8

代码:

class A{
public:
A(){};
~A(){};
virtual void fun(){};
};
class Base1 : public virtual A{
public :
virtual void fun(){};
};
class Base2 : public virtual A{
public:
Base2(){};
~Base2(){};
virtual void fun(){};
};
int main()
{
cout << sizeof(Base1) << endl;// 8
cout << sizeof(Base2) << endl;// 12

return 0;
}

内存布局如下



可以发现Base2多了一个vtordisp域,

关于vtordisp域中MSDN的解释:虚拟继承中派生类重写了基类的虚函数,并且在构造函数或者析构函数中使用指向基类的指针调用了该函数,编译器会为虚基类添加vtordisp域

在经过测试之后,只有在重写虚函数并且存在显式的构造函数情况下,就会生成vtordisp域

并且在文档写到

Specifying 1 or on, the default, enables the hidden vtordisp members where they are necessary.

Specifying 2 enables the hidden vtordisp members for all virtual bases with virtual functions. vtordisp(2) might be necessary to ensure correct performance of dynamic_cast on a partially-constructed object. 

所以vtordisp域是可以不生成的 在预处理中 #pragma vtordisp(on/off)

那么vtordisp是干什么的?

关于vtordisp的作用 在网上找到了这样一段话

In the virtual inheritance case, the vtordisp value is not stored in the __virtual_inheritance pointer! Instead, the compiler hard-codes it into the assembly output when the function is invoked. But to deal with incomplete types, you need to know it.

所以我的理解是vtordisp的作用就是处理虚继承时虚指针里出现不完整类型的情况(如有错误请指出)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值