由於多重繼承產生的二義性引入了類的虛繼承,先看下什麼是二義性。
類d是類b和類c的派生類,而類b,類c就是繼承於類a,當d呼叫類a中的函式時不知道是類b繼承a的,還是類c繼承a的,引起了二義性。虛繼承可以解決這個問題。
使用語法:
class 派生類:virtual 繼承方式 虛基類
;
上圖中類d 例項化過程中的初始化順序:
祖父類(a)--->父類(從左到又)--->子類,並且最後一次初始化有效
#include #include using namespace std;
class a
void displaya()
private:
int i;
};class b:virtual public a //虛繼承
void displayb()
private:
int i;
};class c:virtual public a //虛繼承
void displayc()
private:
int i;
};class d: public b, public c //多重繼承
void displayd()
private:
int i;
};int main()
執行結果:
編譯器在例項化d時,之呼叫了一次虛基類的建構函式,忽略了虛基類a派生類b,c對續虛基類建構函式的呼叫,保證了虛基類的資料成員不會被初始化多次。
C 虛繼承和虛繼承
虛繼承是在多繼承中為了解決衝突而技術。學術一點來說,是指乙個指定的基類,在繼承體系結構中,將其成員資料例項共享給也從這個基類直接或間接派生的其他類。虛繼承非常有用,可以避免多繼承的歧義和多重拷貝。考慮有如下繼承結構。b和c繼承a,d多繼承b c,我們看以下 class a class b publi...
虛函式 虛繼承 C
關於虛表,我們就要用到乙個關鍵字 virtual,可以修飾函式,也可以修飾類。類的成員函式被virtual修飾之後,就成為了虛函式 修飾類,主要是虛繼承。在此之前,我們首先要了解乙個概念 物件模型,也就是說,乙個基類形成之後,裡面的成員是怎麼存放的,當派生類繼承基類之後,派生類的成員是怎麼存放的。我...
C 多重繼承 虛繼承
c 中的多繼承,建構函式處理並沒有問題,物件構造的時候按照繼承中宣告的順序呼叫多個父類的建構函式,析構函式同樣遵守單繼承中的原則。二意性問題 如果多基類中存在同名成員,會產生二意性的問題 比如,root1類中宣告doany 介面,root2類中也宣告了doany 介面,child多承繼root1和r...