天天看點

初識C++面向對象特性——多态

個人了解,用一句話來概括多态就是:一個接口(函數)能實作不同種方法

c++的多态分為靜态多态和動态多态

靜态多态:指的就是重載(編譯的時候函數位址就已經确定)

動态多态:繼承并重寫基類的虛函數

關于靜态多态(重載),比較簡單,下面用兩段代碼來示範一下

第一段代碼通過重載實作了函數的多态

第二段代碼通過重載實作了類中成員函數的(靜态)多态

為什麼要使用虛函數來實作動态多态呢,因為存在這種情況:父類想通過多态的特性使用子類的成員函數,如下面代碼所示

執行結果如下

初識C++面向對象特性——多态

 可以看到test想通過多态特性使用指針調用子類b中的成員函數,但是他調用的仍然是他自己的func1(),為什麼會這樣?就要從動态多态的實作原理——虛表說起

弄清了虛表結構之後回到上面的代碼,通過虛函數我們能實作什麼操作?虛函數該怎麼用來實作(動态)多态?

首先通過虛函數,父類可以調用子類的成員函數

使用方法:

此時類a調用的function()就是子類中的function

要注意的是虛函數隻能通過指針或者引用來達到多态效果,直接執行個體化一個類然後直接調用虛函數是無法實作多态的

解釋一下為什麼基類析構函數要寫成虛函數

實際上,在編譯器中,析構函數會被特殊處理,他們也是具有多态性的函數。a的類型是子類,是以析構a的時候需要用son的析構函數,但是如果父類中的析構函數沒有使用虛函數,那麼delete a在啟動虛構函數時,會直接調用父類的析構函數,new son申請到的空間就沒有得到回收,會造成記憶體洩漏。

總結一下多态的優點

可替換、可擴充、靈活、使用簡單以及接口性(接口行是什麼意思還沒弄清)

繼續閱讀