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

2021-08-31 21:22:50 字數 1321 閱讀 4285

就是乙個派生類多個基類,幾乎與單繼承是一致的。

唯一考點:

菱形繼承結構(b類c類繼承a類,d類繼承a類。),產生問題,派生類有多份基類的資料。   解決辦法:b c都採用虛繼承,只有乙個虛繼承也無法解決該問題。

虛繼承:

厲害了,virtual不僅可以宣告虛函式,還可以設定繼承方式:虛繼承         

被採用虛繼承的基類 a,稱為虛基類

此時派生類的大小擴大:會有虛基類指標b,c都會產生乙個虛基類指標 vbptr(virtual base ptr)。並且如果基類有虛函式,所以派生類還會有虛函式指標vfptr。

重點:

正常繼承,派生類物件的記憶體先放:   基類物件,再放自己的成員變數。   並且這個是派生類包含著基類內容

而虛繼承,派生類物件的記憶體先放 :   乙個虛基類指標vbptr、和自己的成員變數,之後放基類物件。          這兩個卻是並列存放的。所以a的am就是d自己的了,需要d自己構造

將b,c相同繼承下來的a,放到最後面,在原來的地方會留下虛基類指標。b乙個 c乙個,還有個虛基類表(第一行 存放的是虛基類指標自己的偏移位址,一般是0. 第二行存放的是,虛基類指標到a成員變數的偏移位址),存放的是a成員變數的偏移量,用這個指標可以找到a的成員變數。

舉個栗子:

class a

~a()

protected:

int ma;

};class b : virtual public a 就在這!!!!!!!!!!!

~b()

protected:

int mb;

};class c : virtual public a 就在這!!!!!!!!!!!

附一篇部落格從記憶體布局看虛基類,挺詳細的:

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

多重繼承的特性和使用和單繼承沒區別。按照單繼承來使用即可。多重繼承可能會引入乙個 菱形繼承的問題 這個問題其實並不算問題,因為它合情合理,即多個基類 擁有乙個共同的基類,那麼在構造的時候,由於構造的遞迴特性,就會出現共同基類出現兩份例項的 情況,而且如果針對性修改,那麼如果不在訪問共同基類的時候先指...

C 多重繼承 虛繼承

c 中的多繼承,建構函式處理並沒有問題,物件構造的時候按照繼承中宣告的順序呼叫多個父類的建構函式,析構函式同樣遵守單繼承中的原則。二意性問題 如果多基類中存在同名成員,會產生二意性的問題 比如,root1類中宣告doany 介面,root2類中也宣告了doany 介面,child多承繼root1和r...

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