鑽石(菱形)繼承和虛基類

2022-09-16 19:15:15 字數 1396 閱讀 8610

鑽石(菱形)繼承

如圖,b,c繼承了a,d繼承了b,c

在這種情況下,如果d類的物件通過b、c兩個不同的作用域呼叫a的資料成員,將會產生兩個

不同的a的資料成員值

如下(grandfather對應a,a是其公有資料成員,father1,father2對應b、c,son對應d的物件,)

可以看到有兩個不一樣的a存在,說明在賦值過程中father1,father2分別呼叫grandfather產生兩個a

從其執行結果也可以看出來

如果son物件僅想產生乙個資料成員a,則必須對grandfather進行虛繼承

//

test1.h

#includeusing

namespace

std;

class

grandfather

~grandfather()

};class father1 : public

virtual

grandfather

~father1()

};class father2 : virtual

public grandfather //

virtual寫在public前後都可以

~father2()

};class son : public father1, public

father2

~son()

};

虛繼承就是在繼承符(public、protected、private)前或後加上virtual關鍵字,被虛繼承的類也叫虛基類

在派生類物件的建立中,

首先是虛基類的建構函式並按他們宣告順序構造。

第二批是非虛基類的建構函式按他們宣告的順序呼叫

第三批是成員物件的建構函式

最後是派生類自己的建構函式。

可以看到兩個資料成員的位址相同。

執行結果

析構順序和構造順序相反。

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

就是乙個派生類多個基類,幾乎與單繼承是一致的。唯一考點 菱形繼承結構 b類c類繼承a類,d類繼承a類。產生問題,派生類有多份基類的資料。解決辦法 b c都採用虛繼承,只有乙個虛繼承也無法解決該問題。虛繼承 厲害了,virtual不僅可以宣告虛函式,還可以設定繼承方式 虛繼承 被採用虛繼承的基類 a,...

菱形繼承和菱形虛繼承

繼承是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...

虛繼承和虛基類

虛繼承主要解決在多重繼承中的菱形繼承問題,也就是說 b和c類同時繼承了a類,然後d類繼承了b,c類,那麼d類的虛表就會有重複的函式指標。include using namespace std 虛基類 class person person person string name name name e...