關於菱形繼承
相當於在c++中,分別建立四個類,動物類,羊類,駝類,羊駝類,繼承關係如圖所示。
在類中只建立乙個屬性,年齡。
// 動物類
class animal
;//羊類
class sheep:virtualpublic animal
;//駝類
class tuo:virtualpublic animal
;//羊駝類
class sheeptuo:public sheep,public tuo
;由於羊類和駝類同時繼承了動物類中的年齡屬性,而羊駝類又繼承了羊類和駝類的動物屬性,所以羊駝類中有兩份年齡屬性的資料,造成了資源浪費,同時定義不明確。
此時需要用虛繼承的方式來解決
在上一級繼承時,採用在繼承前加關鍵字virtual
則在羊類和駝類中的年齡屬性,到了羊駝類中,變成了同乙份年齡屬性
呼叫開發人員命令提示符,可以檢視羊駝類的繼承屬性
此指標指向的是下方的虛基類表,如圖:
羊類中的vbptr指向的虛基類表中,指標偏移量為8,此時原位置0+8後就指向了年齡屬性,如圖:
同理,駝類中的vbptr指向的虛類列表中,指標偏移量為4,此時原位置4+4後就指向了年齡屬性,如圖:
由於兩個基類,用指標指向同乙個屬性,所以不會產生重複資料,並且訪問時不會產生二義性。
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 ...
C 繼承6 虛繼承 菱形繼承
建立 1.farmer類,資料成員 m strname,成員函式 構造 析構 sow 2.worker類,資料成員 m strcode,成員函式 構造 析構 carry 3.migrantworker類,資料成員 無,成員函式 構造 析構 4.person類,資料成員 m strcolor,成員函式...
c 多重繼承 虛繼承 菱形繼承
多重繼承的特性和使用和單繼承沒區別。按照單繼承來使用即可。多重繼承可能會引入乙個 菱形繼承的問題 這個問題其實並不算問題,因為它合情合理,即多個基類 擁有乙個共同的基類,那麼在構造的時候,由於構造的遞迴特性,就會出現共同基類出現兩份例項的 情況,而且如果針對性修改,那麼如果不在訪問共同基類的時候先指...