#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...