首先要說一下多繼承,虛基類和虛繼承都是在多繼承的一種情況下存在的內容。
多繼承是子類繼承自多個父類的繼承方式。
但是在多繼承的過程中,存在這樣一種情況,乙個基類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 中類的繼承非常的廣泛,但當乙個類繼承了兩個或兩個以上的類的時候,如果在其繼承的多個基類中存在相同的函式成員,在呼叫該函式時,就會產生不知道呼叫哪個基類的函式,產生二義性。通常通過在呼叫時加上作用域操作符 指明呼叫的基類函式便可解決。這裡再講一種需要用到...