关于C++虚拟继承的问题

Jun*_*jie 9 c++ virtual inheritance

以下代码来自"Inside the C++ object model"一书

#include <iostream>  
using namespace std;
class X{};
class Y: public virtual X{};
class Z: public virtual X{};
class A: public Y, public Z{};

int main()
{
     cout<<sizeof(X)<<" "<<sizeof(Y)<<" "<<sizeof(Z)<<" "<<sizeof(A)<<endl;
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的电脑(Windows,VS2010)中,输出为:

1 4 4 8

这是我的问题

1,sizeof(X)= 1

该书说当X类型生成两个实例时,比如说xa和xb.编译在A中插入一个字节,以便xa和xb可以有不同的地址.我不太明白原因.

2,sizeof(Y)= 4

通过使用虚拟继承,我们还有一个额外的虚拟指针吗?我想这可能与多态中的虚拟指针不同.任何人都可以给我Y的内存布局吗?

谢谢!

bil*_*llz 6

  1. 当类为空时编译新的一个char,因此它可以生成不同的对象
  2. sizeof(Y)= 4,因为它是虚拟继承,构造将生成vptr表,这是32位系统上的4个字节
  3. 如果你正在使用visual studio使用/ d1reportAllClassLayout在properties-> C/C++/Command中生成对象布局类Y对象布局将在Visual Studio上:
  4. Stanley B. Lippman的书"Inside C++对象模型"非常清楚地解释了这一点

 
        class Y size(4):
            +---
            0     | {vbptr}
            +---
            +--- (virtual base X)
            +---
Y::$vbtable@: 0 | 0 1 | 4 (Yd(Y+0)X)

vbi: class offset o.vbptr o.vbte fVtorDisp X 4 0 4 0
Run Code Online (Sandbox Code Playgroud)