c 菱形繼承的二義性問題及解決辦法虛繼承

2021-10-12 20:01:36 字數 1296 閱讀 8585

菱形繼承:

容易產生的問題:資料重疊 (何為資料重疊,那上面的圖來說,b,c中分別含有a的乙份同名成員,那麼d中有兩份相同的a中的成員,我要訪問的時候該訪問哪個呢?

下面借用黑馬老師的乙個例子來簡單的說明這個問題:

解決方法:1.加作用域訪問

void test01()
2.設定為虛繼承

深入**:普通繼承相當於直接複製基類,然後納進自己,

虛繼承則相當於繼承了個存放位址,而不是專門開闢乙個新的空間去儲存繼承來的成員,任何時候需要對資料的改動都是對原來的同乙份進行改動,從而實現了實時跟新。

#include#includeusing namespace std;

class animal ;

class sheep:virtual public animal {}; //設定為虛繼承

class tuo :virtual public animal{}; //設定為虛繼承

class sheeptuo :public sheep, public tuo {};

void test01()

int main()

虛繼承只能解決上述的特定問題,但是如果我在每個類中都將那份同名成員重寫,這時候就只能通過加作用域的方式來訪問。 

虛擬繼承解決菱形繼承帶來的二義性問題的過程詳析

二義性問題請詳細看 include using namespace std class grandam class mother virtual public grandam class aunt virtual public grandam class daughter public mother...

C 虛繼承如何解決了菱形繼承的二義性問題

從 分析 includeusing namespace std class a class b virtual public a class c virtual public a class d public b,public c 菱形繼承和菱形虛繼承的物件模型 int main 分別從菱形繼承和虛...

C 多層繼承二義性問題

多繼承可以看作是單繼承的擴充套件。所謂多繼承是指派生類具有多個基類,派生類與每個基類之間的關係仍可看作是乙個單繼承。多繼承下派生類的定義格式如下 class 派生類名 繼承方式1 基類名1 繼承方式2 基類名2 其中,繼承方式1 繼承方式2 是三種繼承方式 public private protec...