當乙個子類同時繼承了兩個父類,這兩個父類有同時繼承同乙個父類,這樣的結構成為菱形繼承,又叫磚石繼承。
菱形繼承會帶來兩個問題:
首先我們來構造乙個這樣的類結構:
class
base
;class
son1
:public base
;class
son2
:public base
;class
grandson
:public son1,
public son2
;
這是一種標準的菱形繼承,我們來嘗試訪問以下屬性成員:
但我們很清楚,這兩個m_age意義完全相同,並且最終都繼承自base類,怎麼解決這種資源浪費呢?
這就要用到虛繼承。
我們在繼承方式前加上virtualtual就成為了虛繼承。
將上面的類結構改為這樣,可以解決資源浪費的問題:
class
base
;class
son1
:virtual
public base
;class
son2
:virtual
public base
;class
grandson
:public son1,
public son2
;
這樣相當於son1和son2繼承的是m_age的指標,也就是只有乙份資料了。
雖然是指標,但還有點不同,因為每個類物件可以有自己獨有的屬性值,個不影響。
寫乙個示例就知道了:
int
main()
執行結果:
菱形繼承 菱形虛擬繼承
菱形繼承 鑽石繼承 模型 拿如下 舉例 class person class student public person class teacher public person class graduate public student,public teacher void test 當派生類gr...
菱形繼承和菱形虛繼承
繼承是c 的一大特點,我們通過菱形繼承和菱形虛繼承對繼承進行進一步的分析。菱形繼承 建立乙個基類a讓b1和b2公有繼承於它,讓c公有繼承b1和b2。class a a int a class b1 public a b1 int b1 class b2 public a b2 int b2 clas...
多重繼承(菱形繼承)
多重繼承 經典的是菱形繼承,如圖。菱形繼承將會產生的問題 把基類a中的成員變數通過b和c兩次繼承至d。d的繼承結構 可以看到,ma被繼承兩次至d 那麼將如何解決這個問題呢?採用虛繼承的方法,將基類a中的ma直接繼承至d。如下 class a int ma class b virtual public...