本文基于VS2012编译器,不同的编译器结果可能有较大出入
来看这样一段代码
class A
{ };
class C:virtual public A
{ };
class B:virtual public A
{ };
class D:public C,public B
{ };
int main ()
{
cout<<sizeof(A)<<endl;
cout<<sizeof(C)<<endl;
cout<<sizeof(B)<<endl;
cout<<sizeof(D)<<endl;
}
最简单的菱形继承,C和B中因为virtual继承了A,所以内含一个虚基类指针指向A,A由编译器自动填充一个char
运行结果
D继承了C和B,拥有C和B包含的成员变量,两个虚基类指针,而且在当前环境下,A被布局在D的尾部,详情如下
1> class A size(1):
1> +---
1> +---
1> class C size(4):
1> +---
1> 0 | {vbptr}
1> +---
1> +--- (virtual base