菱形繼承(鑽石繼承)
模型:
拿如下**舉例:
class person
;class student :public person
;class teacher :public person
;class graduate :public student, public teacher
;
void test()
當派生類graduate繼承了基類student,teacher後,同樣也繼承了它們的成員變數,而基類student,teacher又都繼承了基類person,都有變數_name,graduate的物件中就有了兩份name成員,這就造成了菱形繼承的二義性和冗餘問題,編譯系統無法判定應該選擇哪乙個基類中的_name,解決方法之一是指明資料成員的作用域,如上函式void test()中。
接下來細細說明一下:
class a
virtual void func2()
int _a;
};class b :public a
virtual void func3()
int _b;
};class c :public a
virtual void func4()
int _c;
};class d :public b, public c
virtual void func5()
int _d;
};typedef void(*v_func)();
void printvtable(int* vtable)
cout << "*********************************" << endl;
}int main()
菱形繼承的動態模型:
在以上的方法,在派生類物件名後增加直接基類名,避免了二義性,但是它保留多份資料成員的拷貝,不僅占用較多的儲存空間,還增加了訪問成員的困難,因此我們還有另一種方法可以解決菱形繼承的二義性和冗餘問題,
這裡我們引入虛繼承,虛繼承解決了在菱形繼承體系裡子類物件包含多份父類物件的資料冗餘和浪費空間的問題。
虛繼承的作用:
在繼承間接共同基類時只保留乙份成員。
實現方法:
在該基類的所有直接派生類宣告為虛基類,如下圖所示。
**實現:
class a
virtual void func2()
int _a;
};class b :virtual public a
virtual void func3()
int _b;
};class c :virtual public a
virtual void func4()
int _c;
};class d :public b, public c
virtual void func5()
int _d;
};typedef void(*v_func)();
void printvtable(int* vtable)
cout << "*********************************" << endl;
}int main()
動態模型分析:
1.多重繼承複雜,程式的編寫、除錯和維護都變得更加困難,⼀般不要用。
2.定義菱形結構的虛繼承體系結構,因為虛繼承體系解決資料冗餘問題也帶來了效能上的損耗。
菱形虛擬繼承
菱形繼承在c 繼承中是一種複雜的繼承關係,存在著二義性和資料冗餘的問題,而菱形虛擬繼承則是為了解決菱形繼承所存在的問題。為了 菱形虛擬繼承如何解決該問題,我先建立個乙個較為簡單的菱形繼承模型。下面分別是菱形繼承和菱形虛擬繼承的 實現 菱形繼承 include includeusing namespa...
複雜的菱形繼承及菱形虛擬繼承
乙個子類只有乙個直接父類時稱這個繼承關係為單繼承 乙個子類有兩個或兩個以上的直接父類時稱這個繼承方式為多繼承 菱形繼承是多繼承的一種特殊情況 菱形繼承的問題 1.冗餘 2.二義性 class person class student public person class teacher publi...
菱形繼承與虛擬繼承
c 中的繼承有單繼承和多繼承 本文主要探索的是多繼承中菱形繼承的二義性和資料冗餘及解決方案 菱形繼承的物件模型 從記憶體看菱形繼承物件模型 用乙個簡易 的 來說明二義性和資料冗餘這個問題 class aa class bb public aa class cc public aa class dd ...