c 多重繼承 虛繼承 菱形繼承

2021-10-07 13:22:21 字數 742 閱讀 8724

多重繼承的特性和使用和單繼承沒區別。按照單繼承來使用即可。

多重繼承可能會引入乙個「菱形繼承的問題」,這個問題其實並不算問題,因為它合情合理,即多個基類

擁有乙個共同的基類,那麼在構造的時候,由於構造的遞迴特性,就會出現共同基類出現兩份例項的

情況,而且如果針對性修改,那麼如果不在訪問共同基類的時候先指定直接基類命名空間,則會出現

訪問的二義性。

同時,菱形繼承還會引入乙個共同基類例項的記憶體開銷。

不過,有些場景下,可能還確實需要兩份共同基類。這樣看,菱形繼承 只是乙個 「合理」的現象,而不是

問題,只要當我們不需要兩份共同基類時,它才是「問題」。

解決菱形繼承的方法:使用虛繼承,即找到共同基類的繼承處,在: 後面 和 繼承許可權限制 中間加上

virtual。

class a:public b,public c

class b:virtual public d

class c:virtual public d

虛繼承告訴編譯器,在構造的時候,為其他類只建立乙份自己,類似於類的static成員。

正常的構造呼叫順序:從最底層基類開始,直至最高層子類

正常的析構呼叫順序:與上相反

包含虛繼承的繼承體系構造呼叫順序與上略有不同,編譯器會先輪詢一邊繼承體系,如果存在虛繼承,

那麼構造時會優先構造虛繼承的那個節點,接著按照正常順序構造。析構也是如此,都是虛繼承的節點

優先處理。

多重繼承(菱形繼承)

多重繼承 經典的是菱形繼承,如圖。菱形繼承將會產生的問題 把基類a中的成員變數通過b和c兩次繼承至d。d的繼承結構 可以看到,ma被繼承兩次至d 那麼將如何解決這個問題呢?採用虛繼承的方法,將基類a中的ma直接繼承至d。如下 class a int ma class b virtual public...

C 13 多重繼承 菱形繼承 ,虛繼承,虛基類

就是乙個派生類多個基類,幾乎與單繼承是一致的。唯一考點 菱形繼承結構 b類c類繼承a類,d類繼承a類。產生問題,派生類有多份基類的資料。解決辦法 b c都採用虛繼承,只有乙個虛繼承也無法解決該問題。虛繼承 厲害了,virtual不僅可以宣告虛函式,還可以設定繼承方式 虛繼承 被採用虛繼承的基類 a,...

C 多繼承 菱形繼承 虛繼承

b和c都單繼承了a d繼承了b和c 是多繼承 有兩個或兩個以上的基類就是多繼承 class a public int ma class b public a public int mb class c public a public int mc class d public b,public c ...