菱形继承也称钻石继承,具体模型如下:
菱形继承代码段如下:
#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;}
运行结果如下:
运行结果反而增大了,这似乎出乎我们的意料,但其实不然,这是因为虚拟继承需要额外占用八个字节,出现这样的原因是我们的成员过小,使节省空间这个目的没有明确的表现出来。
菱形虚拟继承模型如下:
新闻热点
疑难解答