菱形繼承的定義是:兩個子類(派生類)繼承同一個父類(基類),而又有一個子類的同時繼承這兩個子類。
菱形繼承的缺點:存在二義性和數據冗余
可以寫出簡單的菱形繼承的代碼如下:
#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(){ DD d; d._a = 1; system("pause"); return 0;}此時,程序無法運行的,顯示如上的錯誤信息,訪問不明確。這是由于DD有兩個父類BB和CC,這兩個同時繼承了AA,同時含有_a,所以應該使用域限定符,才能使得程序正常運行。
#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(){ DD d; d.BB::_a = 0; d.CC::_a = 1; system("pause"); return 0;}這是其中一種方法,但是程序的二義性與數據冗余性并沒有消除,所以可以使用虛擬繼承,代碼如下: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(){ DD d; d._a = 1; d._b = 2; d._c = 3; d._d = 4; system("pause"); return 0;}通過比較分析可以得到下面兩個對象模型:
新聞熱點
疑難解答
圖片精選