我想知道 C++ 中成员变量和 vtable 指针在菱形虚拟继承上的顺序。
考虑以下继承:
class Base
{
int b;
};
class Derived: public virtual Base
{
int d;
};
class Derived2: public virtual Base
{
int d2;
};
class Derived3: public Derived, public Derived2
{
int d3;
};
我想知道Derived3类的内存布局。我在网上查看了以下链接:
经过以上链接后,我觉得Derived3的内存布局可能是:
void* vtable_ptr1 //vtable pointer of Derived
int d //Derived
void* vtable_ptr2 //vtable pointer of Derived2
int d2 //Derived2
int b //Base? not sure where will this be.
int d3 //Derived3
在线编译器将Derived3的大小设置为 40 字节,所以我觉得(假设指针为 8 字节,int 为 4 字节)int b必须在vtable_ptr2 (8( vtable_ptr1 ) + 4( d ) + [4 padding] + 8之后( vtable_ptr2 ) + 4( d2 ) + 4( b ) + 4( d3 ) + [4 class padding]) 或之前vtable_ptr1 (4( b ) + [4 padding] + 8( vtable_ptr1 ) + 4( d ) + [ 4 填充] + 8( vtable_ptr2 ) + 4( d2 ) + 4( d3)) 以便填充出现并将类的大小增加到 40。
总而言之,我有以下问题:
顺序是否正确?如果不是,那么成员变量和 vtable 指针的正确顺序是什么?