12 6 7 菱形繼承

2021-10-08 00:09:20 字數 1046 閱讀 1071

當乙個子類同時繼承了兩個父類,這兩個父類有同時繼承同乙個父類,這樣的結構成為菱形繼承,又叫磚石繼承。

菱形繼承會帶來兩個問題:

首先我們來構造乙個這樣的類結構:

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...