多態(tài)與虛函數(shù)
注意
在成員函數(shù)(靜態(tài)成員、構(gòu)造函數(shù)和析構(gòu)函數(shù)除外)中調(diào)用同類的虛函數(shù)的語句是多態(tài)的。
在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛函數(shù)不是多態(tài)的,編譯時即可以確定調(diào)用的是哪個函數(shù)。
編譯器看到是哪個類的指針,那么就會認為通過它訪問的,就應該是哪個類的成員,編譯器不會分析基類指針到底指向的是基類對象還是派生類對象。
-
區(qū)分多態(tài)和非多態(tài)的情況:
- 通過基類指針或引用調(diào)用成員函數(shù)的語句,只有當該成員函數(shù)是虛函數(shù)時才會是多態(tài)。如果該成員函數(shù)不是虛函數(shù),那么這條函數(shù)調(diào)用語句就是靜態(tài)聯(lián)編的,編譯時就能確定調(diào)用的是那個類的成員函數(shù)。
- 另外,C++語言規(guī)定,只要在基類中某個函數(shù)被聲明為虛函數(shù),那么,在派生類中,同名同參數(shù)表的成員函數(shù)即使前面不寫
virtual
關(guān)鍵字,也自動成為虛函數(shù).
總結(jié)
通過基類的指針,調(diào)用基類和派生類中都有的同名虛函數(shù)時,基類指針指向的是基類對象,執(zhí)行的就是基類的虛函數(shù),基類指針如果指向派生類對象,執(zhí)行的就是派生類的虛函數(shù),這就稱為多態(tài)。多態(tài)也適用于通過基類引用調(diào)用基類和派生類中都有的同名虛函數(shù)的情況。
多態(tài)是通過虛函數(shù)表來實現(xiàn)的。
在普通成員數(shù)中調(diào)用虛函數(shù)是多態(tài)的,但在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛函數(shù)不是多態(tài)的。
有虛函數(shù)的類,其析構(gòu)函數(shù)也應該實現(xiàn)為虛函數(shù)
包含純虛函數(shù)的類稱為抽象類。不能用抽象類定義對象。抽象類的派生類,僅當實現(xiàn)了所有的純虛函數(shù),才會變成非抽象類。