c 中菱形繼承 虛繼承

2021-10-08 23:41:23 字數 1109 閱讀 6864

關於菱形繼承

相當於在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 多重繼承 虛繼承 菱形繼承

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