菱形繼承也稱鉆石繼承,具體模型如下:
菱形繼承代碼段如下:
#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;}
運行結果如下:

運行結果反而增大了,這似乎出乎我們的意料,但其實不然,這是因為虛擬繼承需要額外占用八個字節,出現這樣的原因是我們的成員過小,使節省空間這個目的沒有明確的表現出來。
菱形虛擬繼承模型如下:
新聞熱點
疑難解答