一、多態的實現
1. 在編譯期間實現多態
多態是指在不同的條件下表現出不同的狀態,C++中通過重載函數的方法,可以在編譯期間實現多態。(靜態多態)
在編譯期間,編譯器會根據參數列表的不同尋找合適的函數。
2. 使用虛函數實現多態
通過繼承重寫基類的虛函數實現多態,運行時在虛函數表中尋找調用函數的地址。(動態多態)
在基類的函數前加上virtual關鍵字,在派生類中重寫該函數,運行時會根據對象的實際類型來調用相應的函數。如果對象是子類,就調用子類的函數;如果對象類型是父類,就調用父類的函數,此為多態的表現。
二、多態的實現原理
1.重要名詞
用virtual關鍵字申明的函數叫做虛函數,虛函數肯定是類的成員;
存在虛函數的類都有一個以為的虛函數表叫做虛表。當類中聲明虛函數時,編譯器會在類中生成一個虛函數表;
類的對象有一個指向虛表開始的虛指針。虛表時和類對應的,虛表指針時和對象對應的。
虛函數表是一個存儲類成員函數指針的數據結構;
虛函數表是由編譯器自動生成與維護的;
virtual成員函數會被編譯器放入虛函數表中;
當存在虛函數時,每個對象都有一個指向虛函數的指針
虛函數指針一般作為類對象的第一個成員
2. 虛函數表
虛函數表時通過一塊連續的內存來存儲虛函數的地址。這張表解決了繼承、虛函數(重寫)的問題。在有虛函數的類的對象中都存在一張虛函數表,它就像一張地圖,指向了實際調用的虛函數。
兩篇很好的博文