c 菱形繼承產生的問題及解決

2021-07-23 19:47:24 字數 766 閱讀 2177

#include#include#includeusing namespace std;

class a

int a;

virtual void fun(){}

};class b: public a

int b;

virtual void fun1(){}

};class c: public a

virtual void fun3()

};class d:public c,public b

virtual void fun3()

}; //二義性問題的開銷

int main()

兩個子類繼承同乙個父類,而又有子類又分別繼承這兩個子類,

會產生二義性問題,此時的繼承關係是這樣的:

a           a

|           |

b          c

\         / d

相當於baseclass a在類中有兩個,這可能不是我們想要的結果,增加呼叫的困難,同時也會浪費記憶體資源。

那怎麼解決這種問題呢?使用虛擬繼承!

#includeusing namespace std;

class a{

public:

a(char *s)

{cout/      \

b       c

\        / d

加了virtual後, 繼承關係是這樣的.

c 之多繼承及菱形繼承

c 允許乙個類繼承多個類,但在實際開發中並不建議去使用,可能會引發一些錯誤難以發現,比如菱形繼承 語法 class 子類 繼承方式 父類1 繼承方式 父類2 多繼承語法可能會引發父類中同名成員出現,子類使用時需要加作用域區分 菱形繼承的概念 兩個派生類繼承同乙個基類 又有某個類同時繼承兩個派生類 這...

複雜的菱形繼承及菱形虛擬繼承

乙個子類只有乙個直接父類時稱這個繼承關係為單繼承 乙個子類有兩個或兩個以上的直接父類時稱這個繼承方式為多繼承 菱形繼承是多繼承的一種特殊情況 菱形繼承的問題 1.冗餘 2.二義性 class person class student public person class teacher publi...

c 之菱形繼承問題

昨天面試問了菱形繼承的問題,回答的稀巴爛,回來趕快好好學習一波!菱形繼承如下圖 可以看到,如果不利用域限定需要訪問的函式,那麼就會出現模糊呼叫的問題,但是貌似c 給了更好的方法,虛繼承!includeusing namespace std class base class a virtual pub...