C 虛繼承 虛基類 多繼承 詳細解讀

2021-10-04 10:21:38 字數 1138 閱讀 5484

首先要說一下多繼承,虛基類和虛繼承都是在多繼承的一種情況下存在的內容。

多繼承是子類繼承自多個父類的繼承方式。

但是在多繼承的過程中,存在這樣一種情況,乙個基類a分別被中間基類b、c繼承,然後d又繼承了b、c,此時就出現了問題

?如果子類d使用父類b或者父類c獨有的成員變數,這時沒有問題。但是如果d使用的是a的成員變數,編譯器就不知道使用的b繼承自a的還是c繼承自a的,產生了乙個語義模糊的概念(aimbiguous的錯誤)。

注:成員函式是可以被多繼承的而不產生上述問題,因為函式是在編譯階段就已經生成了記憶體的,不需要像成員變數一樣之後還會有更改。

這時候,就一定要引入虛繼承的概念來避語義的模糊,讓b、c類虛繼承自a,那麼a的成員變數在d中只會保留乙份,所以取消了語義模糊衝突(具體在記憶體中為什麼會這樣我還得在思考思考)。

意味著虛繼承是一種簡介繼承的模式,對虛繼承的子類本身沒有問題,只對該子類的子孫(具體是再往下繼承一層還是多層需要實驗)有影響。

#include using namespace std;

class a ;

class b : public a ;

class c : public a ;

class d : public b, public c

void b_func ()

void c_func ()

void d_func ()

};class i

int reti ()

void speciala ()

};class j : virtual public i

int reti ()

};class k : virtual public i

};class h : public j, public k

void funcb ()

void funcc ()

void funcd ()

const void seti (int i)

const int reti ()

};int main ()

ps:問題?1.虛繼承在一開始出現的時候就是為了解決上述問題的嗎?

2.虛繼承只能用來解決這乙個問題嗎,還可以應用在哪些場景呢?

C 多繼承與虛基類

多繼承的定義 派生類的基類大於乙個 語法 class 派生類名 繼承方式1 基類名1,繼承方式2 基類名2.多重繼承與建構函式的關係 多重繼承時建構函式的作用 1 初始化派生類 自己 2 呼叫該派生類所有基類建構函式,並且為所有基類傳參 引數個數必須包含所有基類所需引數 建構函式語法 派生類建構函式...

多繼承和虛基類

一.多繼承機制存在哪些問題,怎麼解決這些問題?歧義性 相同名稱的成員在記憶體中同時擁有多個拷貝,當通過派生類物件使用這些成員時,就會產生歧義性。作用域操作符雖然能解決歧義性問題,但並沒有解決多個拷貝的問題。類d 的記憶體布局 使用虛擬機制注意事項 1.若在虛基類中定義了帶引數的建構函式,而沒有定義預...

多繼承與虛基類

c 中的多繼承的二義性問題與虛基類的用法。在c 中類的繼承非常的廣泛,但當乙個類繼承了兩個或兩個以上的類的時候,如果在其繼承的多個基類中存在相同的函式成員,在呼叫該函式時,就會產生不知道呼叫哪個基類的函式,產生二義性。通常通過在呼叫時加上作用域操作符 指明呼叫的基類函式便可解決。這裡再講一種需要用到...