代碼重用的手段,利用已有的類(lèi)。
組合:類(lèi)似于使用工具,現(xiàn)有的類(lèi)作為子對(duì)象??硺?shù):斧頭作為子對(duì)象
繼承:類(lèi)似于學(xué)習(xí)本領(lǐng),現(xiàn)有的類(lèi)作為師父??硺?shù):拜師練習(xí)砍樹(shù)的本領(lǐng)。
不論是繼承還是組合,在子類(lèi)中,父類(lèi)或者成員對(duì)象都作為子對(duì)象存在于一塊內(nèi)存之中。因?yàn)闃?gòu)造函數(shù)只初始化本層次的內(nèi)容,所以在進(jìn)入構(gòu)造函數(shù)之前,子對(duì)象的構(gòu)造一定要完成,這是c++強(qiáng)制要做的,因?yàn)椴荒茏屢粋€(gè)未初始化的對(duì)象存在。只有在初始化列表中初始化子對(duì)象。
子類(lèi)中調(diào)用構(gòu)造函數(shù)的次序:先調(diào)用父類(lèi)構(gòu)造函數(shù),再調(diào)用子對(duì)象構(gòu)造函數(shù),按其聲明順序來(lái),并不按照其在初始化列表中的順序。析構(gòu)相反。
名字隱藏:在繼承中,只要子類(lèi)中出現(xiàn)父類(lèi)函數(shù)的名字,其他名字全部被隱藏(包括修改了參數(shù)和返回值),虛函數(shù)暫不涉及(提前報(bào)告,虛函數(shù)在子類(lèi)中不能修改返回值)。
但是修改了基類(lèi)函數(shù)的參數(shù)和返回值相當(dāng)于修改了接口。
非自動(dòng)繼承的函數(shù):
構(gòu)造函數(shù)(拷貝構(gòu)造函數(shù))、析構(gòu)函數(shù)、operator=操作符。如果不創(chuàng)建,編譯器會(huì)自動(dòng)創(chuàng)建。我們創(chuàng)建構(gòu)造函數(shù)和賦值操作符的時(shí)候,最好顯式地調(diào)用父類(lèi)和成員對(duì)象的構(gòu)造函數(shù)和賦值操作符。
所有的多重繼承都可以用單繼承實(shí)現(xiàn)。
向上類(lèi)型轉(zhuǎn)換
原理:子類(lèi)和父類(lèi)的基地址相同,子類(lèi)可以向上類(lèi)型轉(zhuǎn)換為父類(lèi),編譯器將該地址做為父類(lèi)的基地址。必須是引用或者指針。
應(yīng)該使用繼承還是應(yīng)該使用組合,看是否需要向上類(lèi)型轉(zhuǎn)換。
posted on 2012-06-04 14:37
Dino-Tech 閱讀(201)
評(píng)論(0) 編輯 收藏 引用