菱形继承也称钻石继承,具体模型如下:
菱形继承代码段如下:
#include<iostream>
using namespace std;
class AA
{
public:
int _a;
};
class BB:public AA
{
public:
int _b;
};
class CC:public AA
{
public:
int _c;
};
class DD:public BB, public CC
{
public:
int _d;
};
int main()
{
AA a;
BB b;
CC c;
DD d;
cout<<sizeof(a)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(c)<<endl;
cout<<sizeof(d)<<endl;
system("pause");
return 0;
}
运行结果如下:
但由于菱形继承仍有两大缺点:二义性与数据冗余,所以由此我们引进菱形虚拟继承来完善这两点
#include<iostream>
using namespace std;
class AA
{
public:
int _a;
};
class BB:virtual public AA
{
public:
int _b;
};
class CC:virtual public AA
{
public:
int _c;
};
class DD:public BB, public CC
{
public:
int _d;
};
int main()
{
AA a;
BB b;
CC c;
DD d;
cout<<sizeof(a)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(c)<<endl;
cout<<sizeof(d)<<endl;
system("pause");
return 0;
}
运行结果如下:
运行结果反而增大了,这似乎出乎我们的意料,但其实不然,这是因为虚拟继承需要额外占用八个字节,出现这样的原因是我们的成员过小,使节省空间这个目的没有明确的表现出来。
菱形虚拟继承模型如下: