class worker
;class singer : public worker
;class waiter : public worker
;class singerwaiter : public worker,public waiter
;
如上**涉及多重繼承知識點,即singerwaiter即從singer繼承又重waiter繼承。此時有如下問題:
1、在singerwaiter類中到底有多少個woker類
因為singer及waiter都繼承於worker,因此在singerwaiter中會存在兩個woker空間。若忽視這個細節將會出現問題,如下所示:
singerwaiter ed ;
woker* ptr = ed ;
上面的賦值將會使基類指標指向兩個不同的空間因此程式會出現二義性。為解決這個問題c++引入了乙個新技術-虛基類。
虛基類使得從多個類(它們的基類相同)派生出的物件中只繼承乙個基類物件,具體的使用方法如下所示:
class singer: virtual public worker{} ;
class waiter: virtual public worker{} ;
class singerwaiter: publci singer,public waiter{} ;
對於虛基類有新的建構函式規則
介紹規則之前先來講解乙個錯誤,因為該規則是用來改善這個錯誤的。即:
singerwaiter::singerwaiter(const worker& wk,int p = 0,int v = singer::other)
: waiter(wk,p) , singer(wk,v){} //flawed
上述程式存在的問題是,waiter和singer建構函式都會將wk傳遞給worker(基類),這在程式中會出想錯誤。為避免這種錯誤,c++規定了若基類是虛類將會禁止資訊從中間類傳遞給虛類,因此系統希望顯性的去呼叫基類的建構函式(隱式的呼叫預設建構函式也是可以接受的),具體方法如下所示:
singerwaiter::singerwaiter(const worker& wk,int p = 0,int v = singer::other)
:worker(wk),waiter(wk,p),singer(wk,v){}
注意以上使用建構函式的方法只對虛基類來說是合法的! python筆記 2 1 4 5多重繼承
coding utf 8 created on tue may 14 11 01 33 2019 author user class human object domain eukarya def init self,kingdom animalia phylum chordata order pr...
多重繼承 C 中的多重繼承
多重繼承是c 的一項功能,其中乙個類可以從多個類繼承。繼承類的建構函式以它們繼承的相同順序被呼叫。例如,在以下程式中,在a的建構函式之前呼叫b的建構函式。include using namespace std class a class b class c public b,public a not...
C 學習筆記4(繼承 派生 多重繼承)
1 繼承 在乙個已經存在的類的基礎上建立乙個新的類。通過繼承,乙個新建子類從已有的父類那裡獲得父類的特性。從另一角度看,從已有的類 父類 產生乙個新的子類,稱為類的派生。單繼承 乙個派生類只從乙個基類派生 多重繼承 乙個派生類有兩個或多個基類。派生類是基類的具體化,而基類是派生類的抽象。2 宣告派生...