今天在复习虚函数的时候,看到很多博客上写虚继承的子类时,没有添加构造函数,所以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的作用就是处理虚继承时虚指针里出现不完整类型的情况(如有错误请指出)