為什麼C 需要虛繼承

2021-07-16 15:36:04 字數 1996 閱讀 3399

先看個編譯多繼承帶來的編譯錯誤

/*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

***> file name: muti_inherit.cpp

> author: guoqingyao

> mail: [email protected]

> created time: 2023年08月11日 星期四 12時38分35秒

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*******/

#include

using namespace std;

class a

;class b : public a

;class c : public a

;class d : public b, public c

;int main()

編譯錯誤

dotheright@dotheright:~/mylovelycodes/cpp/base/9$

g++ muti_inherit.cpp

muti_inherit.cpp: in function 『int main()』:

muti_inherit.cpp:31:4: error: request for member 『a』 is ambiguous

d.a = 1;

^ muti_inherit.cpp:13:6: note: candidates are: int a::a

int a;

^ muti_inherit.cpp:13:6: note: int a::a

這裡出現的錯誤是d.a 有二義性,這時候我們就要找二義分別是指的什麼?

變數a的一種繼承關係

變數a的另一種繼承關係

a 由兩份copy 所以會有二義性,消除二義性就是a只留乙份,需要用到虛繼承

/*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

***> file name: muti_inherit.cpp

> author: guoqingyao

> mail: [email protected]

> created time: 2023年08月11日 星期四 12時38分35秒

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*******/

#include

using namespace std;

class a

;class b :virtual public a

;class c :virtual public a

;class d : public b, public c

;int main()

為什麼需要虛析構函式

這樣做是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。class clxbase virtual clxbase virtual void dosomething class clxderived public clxbase clxderived void dosomet...

C 虛繼承和虛繼承

虛繼承是在多繼承中為了解決衝突而技術。學術一點來說,是指乙個指定的基類,在繼承體系結構中,將其成員資料例項共享給也從這個基類直接或間接派生的其他類。虛繼承非常有用,可以避免多繼承的歧義和多重拷貝。考慮有如下繼承結構。b和c繼承a,d多繼承b c,我們看以下 class a class b publi...

C 為什麼不要多重繼承

不如換種做法?總結多重繼承指的是某個類同時繼承了兩個或以上的其他類。那麼多重繼承存在著什麼問題呢?class machine machine class printer public machine class scanner public machine class printerscanner ...