就是乙個派生類多個基類,幾乎與單繼承是一致的。
唯一考點:
菱形繼承結構(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 ...