lass A
{
? ? char k[3];
public:
? ? virtual void aa()
? ? {
?
? ? };
};
class B:public virtual A
{
? ? char j[3];
public:
? ? virtual void bb()
? ? {
? ? ? ??
? ? };
};
class C:public virtual A
{
? ? char i[3];
public:
? ? virtual void cc()
? ? {
? ? ? ??
? ? };
};
class D: public B,public C
{
? ? char n[3];
? ? public:
? ? ? ? virtual void dd()
? ? ? ? {
? ? ? ??
? ? ? ? ?};
};
int main()
{ ? ?
? ? cout<
? ? cout<
? ? cout<
? ? cout<
? ? return 0;
}
复制代码
得到的结果为:8 20 20 36
?
分析如下:
?
1、类sizeof(A,B,C),从前面的分析可以得到结果为8 20 20;
?
2、sizeof(D)=4(指向自己虚函数的虚指针)+4(自己的数据成员)+
?
? ? ? ? ? ? ? ? ? ? 12(父类B的内容,包括数据成员、指向虚函数的虚指针、以及虚基类指针列表vptr_B_A)+
?
? ? ? ? ? ? ? ? ? ? 12(父类C的内容,包括数据成员、指向虚函数的虚指针、以及虚基类指针列表vptr_C_A)+
?
? ? ? ? ? ? ? ? ? ? 4(类A的数据成员)=36。
?
? ? ?可见,类D中只包含了类A的一份副本,虚继承很好地解决了多重继承中的二义性问题。