多繼承的定義:派生類的基類大於乙個
語法:
class 派生類名:繼承方式1 基類名1,繼承方式2 基類名2...
;
多重繼承與建構函式的關係:
多重繼承時建構函式的作用:
1)初始化派生類(自己)
2)呼叫該派生類所有基類建構函式,並且為所有基類傳參(引數個數必須包含所有基類所需引數)
建構函式語法:
派生類建構函式名(總參數列列): 基類1建構函式(參數列列), 基類2建構函式(參數列列), 基類3建構函式(參數列列)
說明:派生類的建構函式的成員初始化列表中必須列出對虛基類建構函式的呼叫;如果未列出,則表示使用該虛基類的預設建構函式。
具體點來說:初始化列表中要包括對 直接基類 + 虛基類 進行呼叫。
建構函式的執行次序(不含虛基類):
(1)基類:依派生的次序決定,與建構函式中書寫順序無關
(2)子物件的建構函式
(3)派生類的建構函式
析構函式的執行次序:和上述執行順序相反
注意:1)析構函式能繼承;
2)派生類中要定義自己的析構函式釋放在派生中新增的成員;
3)從基類中繼承的成員釋放,可以通過基類的析構函式實現;
4)啟用析構函式的順序與建構函式繳活順序相反。
舉例:
#include using namespace std;
class a
注意:宣告後,當基類通過多條派生路徑被乙個派生類繼承時,該派生類只繼承該基類一次
虛基類的初始化:與一般多繼承的初始化在語法上是一樣的,但建構函式的呼叫次序不同.
派生類建構函式的呼叫次序:(先虛基類,後基類,再成員物件,最後自身)
(1)對虛基類間的建構函式的順序:根據虛基類間繼承的順序呼叫
(2)對基類間的建構函式的順序:根據基類間繼承的順序呼叫
(3)對成員物件的建構函式的順序:根據成員物件在類中宣告順序呼叫
(4)若同一層次中包含多個虛基類,這些虛基類的建構函式按它們說明的次序呼叫;
(5)若虛基類由非虛基類派生而來,則仍先呼叫基類建構函式,再呼叫派生類的建構函式.
舉例:
class a : public b, public c,virtual public d
{}x one;
將產生如下呼叫次序:
d()b()
c()a()
說明:
1)d是a的虛基類,故先呼叫d的建構函式
2)在同層次的多個虛基類中,從左到右呼叫,先b到c
3)基類構造函式呼叫完後,在呼叫a的建構函式
舉例:使用虛基類和不使用虛基類的說明:
錯誤**:
#includeusing namespace std;
class a
};class b1: public a
};class b2: public a
};class c:public b1,public b2
void display() };
class b:virtual public a
};class c:virtual public a
};class d:public b,public c
void display()
{ cout<
注意:1、派生類建構函式初始化列表對虛基類的處理:
有虛基類和沒費基類兩種情況下,派生類建構函式的書寫情況是不一樣的,上面注釋有**。
沒有虛基類的多繼承,派生類建構函式的宣告只包括其直接的基類
有虛基類的多繼承,派生類建構函式的宣告不僅包含其直接基類還要包含直接基類的虛基類。
2、1)執行時,c建立物件時,先找到直接基類b1,呼叫直接基類b1的建構函式時,又呼叫a的建構函式,無基類,直接呼叫
2)之後,在呼叫b1的建構函式,之後再調b2的建構函式時,發現有基類a,但是a為虛基類,已經呼叫過一次,不再呼叫
3)之後,直接呼叫b2的建構函式,完了,就直接呼叫c的建構函式
說明:1、虛基類怎麼保證初始化派生類物件時,只被呼叫一次?
因為:初始化列表中要包括對 直接基類 + 虛基類 進行呼叫,但僅僅用建立物件的最遠派生類的構造函式呼叫虛基類的建構函式,而該派生類的所有基類中列出的對虛基類
的建構函式的呼叫在執行中被忽略,即對其他基類來說,這個基類是虛假的,而不再呼叫虛基類,從而保證對虛基類子物件只初始化一次。
2、乙個類可以在乙個類族中既被用作虛基類,也被用作非虛基類。
多繼承與虛基類
c 中的多繼承的二義性問題與虛基類的用法。在c 中類的繼承非常的廣泛,但當乙個類繼承了兩個或兩個以上的類的時候,如果在其繼承的多個基類中存在相同的函式成員,在呼叫該函式時,就會產生不知道呼叫哪個基類的函式,產生二義性。通常通過在呼叫時加上作用域操作符 指明呼叫的基類函式便可解決。這裡再講一種需要用到...
C 多繼承與虛基類 練習
1.掌握多重繼承的使用。2.理解虛基類的作用。3.熟悉派生類物件與基類的轉換。1.將 和執行結果複製到word文件提交。2.word文件命名格式 實驗x 姓名 學號。3.禁止抄襲。4.按時提交。1.從person類派生出學生類student和教師類teacher 從student類中派生研究生類gr...
C 虛繼承 虛基類 多繼承 詳細解讀
首先要說一下多繼承,虛基類和虛繼承都是在多繼承的一種情況下存在的內容。多繼承是子類繼承自多個父類的繼承方式。但是在多繼承的過程中,存在這樣一種情況,乙個基類a分別被中間基類b c繼承,然後d又繼承了b c,此時就出現了問題 如果子類d使用父類b或者父類c獨有的成員變數,這時沒有問題。但是如果d使用的...