鑽石(菱形)繼承
如圖,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進行虛繼承
//虛繼承就是在繼承符(public、protected、private)前或後加上virtual關鍵字,被虛繼承的類也叫虛基類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()
};
在派生類物件的建立中,
首先是虛基類的建構函式並按他們宣告順序構造。
第二批是非虛基類的建構函式按他們宣告的順序呼叫
第三批是成員物件的建構函式
最後是派生類自己的建構函式。
可以看到兩個資料成員的位址相同。
執行結果
析構順序和構造順序相反。
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...