菱形繼承和虛繼承

2021-07-27 00:05:56 字數 1003 閱讀 3500

1.菱形繼承

菱形繼承概念圖:

菱形繼承物件模型:

參照菱形繼承物件模型,不難發現若呼叫dd類時,裡面包含兩個相同的aa類的所有成員,在呼叫過程中會出現二義性和資料冗餘的問題,為了解決上述問題,我們提出了虛繼承。接下來通過簡單例項**講解虛函式及底層實現。

**樣例:

#include 

using namespace std;

class aa

;class bb : virtual

public aa

;class cc : virtual

public aa

;class dd : public bb,public cc

;int main()

通過**樣例,利用記憶體除錯視窗我們可以觀察到記憶體位址分配以及逐步賦值操作順序和位址。

圖中的20和12是相對於aa位址的偏移位址。通過虛繼承(+viryual關鍵字),dd中重複繼承的類aa歸於乙個,解決了菱形繼承中二義性的問題。

通過應用偏移位址,在賦值操作前,將兩個相同且重複aa類位址分別賦予不同的偏移位址,保證其正確的儲存。aa被分配到最底層的位址,通過記憶體一步步除錯,觀察賦值過程。

上圖經過記憶體除錯,通過位址可以看出其偏移位址。可以看出中間相差8個位元組,通過多占用8個位元組的空間,以空間換時間,解決資料冗餘的問題。

菱形繼承和菱形虛繼承

繼承是c 的一大特點,我們通過菱形繼承和菱形虛繼承對繼承進行進一步的分析。菱形繼承 建立乙個基類a讓b1和b2公有繼承於它,讓c公有繼承b1和b2。class a a int a class b1 public a b1 int b1 class b2 public a b2 int b2 clas...

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,成員函式...