C++中虚基类中关于内存计算的问题

情况一:
class D{
public:
int a;
};
class A:virtual public D{

};
class B :virtual public D{

};
class C:public A,public B{
public:
int a1;
};
用sizeof(C)计算出等于16;
情况二:
class D{
public:
int a;
};
class A:public D{

};
class B :public D{

};
class C:public A,public B{
public:
int a1;
};
用sizeof(C)计算出等于12;
情况一本人理解不了哪位大神给分析分析吧

virtual -- 关键字,继承了,是深拷贝。class C的size = 4 + 3*4 = 16
一个a1 的size + 3个a的size;
没有virtual,相同时,共享: class C 的size= 4 + 2*4 =12
一个a1 的size + 2个a的size;
因为class C继承 A,B,共享了一个a的size

frank_20080215说法就不对了。不是3个a的size

 #include <iostream>
using namespace std;
class D{
public:
int a;
int b;
};
class A:virtual public D{
};
class B :virtual public D{
};
class C:public A,public B{
public:
int a1;
};
int main()
{
    cout << sizeof(C);
}

结果是20。

class D{
public:
int a;
};
class A:public D{
};
class B :public D{
};
class C:public A,public B{
public:
int a1;
};
int main()
{
cout << sizeof(D)<< endl;
cout << sizeof(A)<< endl;
cout << sizeof(C)<< endl;
} 

结果是4 4 12

  #include <iostream>
using namespace std;
class D{
public:
int a;
};
class A:virtual public D{
};
class B :virtual public D{
};
class C:public A,public B{
public:
int a1;
};
int main()
{
cout << sizeof(D)<< endl;
cout << sizeof(A)<< endl;
cout << sizeof(C)<< endl;
} 

结果是4 8 16

所以看明白了么?后者是因为虚继承本身多耗费了4个字节,同时虚继承只保留了一份指向D的存储,所以是16个字节。