資源描述:
《c++在單繼承、多繼承》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、一、本文目的與說明???1.本文目的:理清在各種繼承時,構(gòu)造函數(shù)、復(fù)制構(gòu)造函數(shù)、賦值操作符、析構(gòu)函數(shù)的執(zhí)行順序和執(zhí)行內(nèi)容。???2.說明:雖然復(fù)制構(gòu)造函數(shù)屬于構(gòu)造函數(shù)的一種,有共同的地方,但是也具有一定的特殊性,所以在總結(jié)它的性質(zhì)時將它單獨(dú)列出來了。???3.單繼承、多繼承、虛繼承,既然都屬于繼承,那么雖然有一定的區(qū)別,但還是相同點(diǎn)比較多。如果放在一塊講,但為了將內(nèi)容制作成遞進(jìn)的,就分開了,對相同點(diǎn)進(jìn)行重復(fù),(大量的復(fù)制粘貼哈),但在不同點(diǎn)進(jìn)行了標(biāo)注。????????注意:三塊內(nèi)容是逐步遞進(jìn)的??????????????
2、???????如果你懂虛函數(shù),那么單繼承和多繼承那塊你就可以不看;?????????????????????如果你懂多繼承,那單繼承你就不要看了,至于虛繼承就等你懂虛繼承再回來看吧;?????????????????????如果你只懂單繼承,那你就只看單繼承就好。二、基本知識???1.對于一個空類,例如;[cpp]?viewplaincopyprint?1.class?EmptyClass{};?????????雖然你沒有聲明任何函數(shù),但是編譯器會自動為你提供上面這四個方法。[cpp]?viewplaincopyprin
3、t?1.class?EmptyClass?{??2.public:??3.????EmptyClass();????????????????????????//??默認(rèn)構(gòu)造函數(shù)??4.????EmptyClass(const?EmptyClass?&rhs);????//??復(fù)制構(gòu)造函數(shù)??5.????~EmptyClass();???????????????????????//?析構(gòu)函數(shù)??6.????EmptyClass&?operator=(const?EmptyClass?&rhs);????//??賦值運(yùn)算符?
4、?7.}?????????對于這四個方法的任何一個,你的類如果沒有聲明,那么編譯器就會自動為你對應(yīng)的提供一個默認(rèn)的。(在《C++primer》中,這個編譯器自動提供的版本叫做“合成的***”,例如合成的復(fù)制構(gòu)造函數(shù))當(dāng)然如果你顯式聲明了,編譯器就不會再提供相應(yīng)的方法。???2.?合成的默認(rèn)構(gòu)造函數(shù)執(zhí)行內(nèi)容:如果有父類,就先調(diào)用父類的默認(rèn)構(gòu)造函數(shù)。???2.?合成的復(fù)制構(gòu)造函數(shù)執(zhí)行內(nèi)容:使用參數(shù)中的對象,構(gòu)造出一個新的對象。???3.?合成的賦值操作符執(zhí)行內(nèi)容:使用參數(shù)中的對象,使用參數(shù)對象的非static成員依次對目標(biāo)對
5、象的成員賦值。注意:在賦值操作符執(zhí)行之前,目標(biāo)對象已經(jīng)存在。???4.在繼承體系中,要將基類(或稱為父類)的析構(gòu)函數(shù),聲明為virtual方法(即虛函數(shù))。???5.子類中包含父類的成員。即子類有兩個部分組成,父類部分和子類自己定義的部分。???6.如果在子類中顯式調(diào)用父類的構(gòu)造函數(shù),只能在構(gòu)造函數(shù)的初始化列表中調(diào)用,并且只能調(diào)用其直接父類的。???7.在多重繼承時,按照基類繼承列表中聲明的順序初始化父類。???8.在虛繼承中,虛基類的初始化?早于?非虛基類,并且子類來初始化虛基類(注意:虛基類不一定是子類的直接父類)。
6、?三、單繼承核心:在構(gòu)造子類之前一定要執(zhí)行父類的一個構(gòu)造函數(shù)。1.構(gòu)造函數(shù)(不包括復(fù)制構(gòu)造函數(shù))。???????順序:①直接父類;②自己?????????????注意:若直接父類還有父類,那么“直接父類的父類”會在“直接父類”之前構(gòu)造??梢岳斫鉃檫@是一個遞歸的過程,知道出現(xiàn)一個沒有父類的類才停止。???2.1如果沒有顯式定義構(gòu)造函數(shù),則“合成的默認(rèn)構(gòu)造函數(shù)”會自動調(diào)用直接父類的“默認(rèn)構(gòu)造函數(shù)”,然后調(diào)用編譯器為自己自動生成的“合成的默認(rèn)構(gòu)造函數(shù)”。????2.2如果顯式定義了自己的構(gòu)造函數(shù)????????2.2.1如果沒
7、有顯式調(diào)用直接父類的任意一個構(gòu)造函數(shù),那么和“合成的默認(rèn)構(gòu)造函數(shù)”一樣,會先自動調(diào)用直接父類的默認(rèn)構(gòu)造函數(shù),然后調(diào)用自己的構(gòu)造函數(shù)。?????????2.2.2如果顯式調(diào)用了直接父類的任意一個構(gòu)造函數(shù),那么會先調(diào)用直接父類相應(yīng)的構(gòu)造函數(shù),然后調(diào)用自己的構(gòu)造函數(shù)。2.復(fù)制構(gòu)造函數(shù)??????????順序:①直接父類;②自己???????????????注意:和構(gòu)造函數(shù)一樣,若直接父類還有父類,那么“直接父類的父類”會在“直接父類”之前構(gòu)造??梢岳斫鉃檫@是一個遞歸的過程,知道出現(xiàn)一個沒有父類的類才停止。???2.1如果?沒有
8、顯式定義復(fù)制構(gòu)造函數(shù),則“合成的復(fù)制構(gòu)造函數(shù)”會自動調(diào)用直接父類的“復(fù)制構(gòu)造函數(shù)”,然后調(diào)用編譯器為自己自動生成的“合成的復(fù)制構(gòu)造函數(shù)”(注意:不是默認(rèn)構(gòu)造函數(shù))?????2.2如果顯式定義了自己的復(fù)制構(gòu)造函數(shù)(和構(gòu)造函數(shù)類似)????????2.2.1如果沒有顯式調(diào)用父類的任意一個構(gòu)造函數(shù),那么會先調(diào)用直接父類的默