多態(tài)性(polymorphism)提供了接口和具體實現(xiàn)之間的另一層間隔逻恐。多態(tài)性改變了代碼的組織性和可讀性辜昵,同時也使創(chuàng)建的程序具有可擴(kuò)展性:程序不僅在項目的最初創(chuàng)建器可以擴(kuò)展寿冕,而且當(dāng)在項目需要新的功能時也能擴(kuò)展“擴(kuò)展”庭瑰。
向上類型轉(zhuǎn)換
一個對象可以作為它自己的類或者作為它的基類的對象來使用扎谎。還能通過基類的地址來操作它桂躏。取一個對象的地址(指針或者引用)钻趋,并將其作為基類的地址來處理。這被稱為向上類型轉(zhuǎn)換:因為繼承樹的繪制方式是以基點(diǎn)為頂點(diǎn)的剂习。
函數(shù)調(diào)用捆綁
- 將函數(shù)體和函數(shù)調(diào)用相聯(lián)系稱為捆綁(binding)蛮位。
- 捆綁在程序運(yùn)行之前完成時,被稱為早捆綁鳞绕。C編譯只有一種函數(shù)調(diào)用方式失仁,就是早捆綁。靜態(tài)語言通常都是早捆綁们何。
- 晚捆綁又稱為動態(tài)捆綁和運(yùn)行時捆綁萄焦。
- C++ 通過虛函數(shù)實現(xiàn)晚捆綁,實現(xiàn)動態(tài)特性冤竹。在運(yùn)行時根據(jù)類的合適的類型信息調(diào)用合適的成員函數(shù)拂封。
虛函數(shù)
- 虛函數(shù)增強(qiáng)了類型的概念。
- 通過一個關(guān)鍵字virtual加成員函數(shù)創(chuàng)建一個虛函數(shù)鹦蠕。
- 僅聲明的時候需要冒签,定義時不需要。如果在基類被聲明為virtual钟病,那么它所有的派生類都是virtual萧恕,在派生類中virtual函數(shù)的重定義通常稱為重寫(overriding)。
- 僅需要在基類中聲明一個函數(shù)為virtual肠阱,調(diào)用所有匹配基類聲明行為的派生類函數(shù)都將使用需機(jī)制廊鸥。在派生類前使用關(guān)鍵字virtual顯得冗余和混亂。
抽象基類和純虛函數(shù)
希望基類僅僅作為其派生類的一個接口辖所。也就是說,僅想對基類進(jìn)行向上類型轉(zhuǎn)化磨德,只是用它的接口缘回,而不希望用戶實際地的創(chuàng)建一個基類的對象,要做到這點(diǎn)典挑,可以在基類中加入至少一個純虛函數(shù)酥宴,來使基類稱為抽象類
純虛函數(shù)使用關(guān)鍵字virtual,并在其后面加上= 0您觉。
當(dāng)繼承一個抽象類時拙寡,必須實現(xiàn)所有的純虛函數(shù),否則繼承出的類也將是一個抽象類琳水。
對象切片
- 當(dāng)多態(tài)的處理對象時肆糕,傳地址和傳值有明顯的不同
- 傳地址時般堆,傳遞派生類對象的地址和傳遞基類對象的地址是相同的。
- 使用多態(tài)的目的诚啃,即讓基類對象操作的代碼能透明的操作派生類對象淮摔。
- 如果對一個對象進(jìn)行向上類型轉(zhuǎn)換而不適用地址或者引用,這個對象將被切片始赎,因為基類對象的大小比派生類對象的大小要小和橙。將派生類對象的值直接賦給基類,派生類將被切割成基類的大小造垛。
- 對象切片實際上是當(dāng)它拷貝到一個新對象上時魔招,去掉原來對象的一部分,而不是像使用指針或者引用那樣簡單地改變地址的內(nèi)容五辽。
虛析構(gòu)函數(shù)
- 構(gòu)造函數(shù)不能為虛函數(shù)办斑。
- 析構(gòu)函數(shù)能夠且常常必須是虛的
- 析構(gòu)函數(shù)能夠?qū)ψ陨磉M(jìn)行清除,然后它執(zhí)行下一個析構(gòu)函數(shù)奔脐,該析構(gòu)函數(shù)又執(zhí)行它的清除工作