1.什麼是 C++ 虛函數?
面向對象的編程語言一個很重要的特性是多態,所謂多態就是用父類的指針和引用指向子類的對象實例,通過父類的指針和引用調用子類的成員函數的,即讓父類的對象擁有“多種形態”。C++ 中多態特性即是通過虛函數來時的。
2.如何在C++中定義虛函數?
virtual 關鍵字
3.虛函數如何工作?
虛表(Virtual Table),所謂虛表即是虛函數的地址表。父類的指針或引用調用成員函數時,它根據這張表找到實際的虛函數地址。在有虛函數的類的實例中這個表被分配在了 這個實例的內存中,所以,當我們用父類的指針來操作一個子類的時候,這張虛函數表就顯得由爲重要了,它就像一個地圖一樣,指明瞭實際所應該調用的函數。
4.C++中虛表是如何實現的?
在C++的標準規格說明書中說到,編譯器必需要保證虛函數表的指針存在於對象實例中最前面的位置(這是爲了保證正確取到虛函數的偏移量)。 這意味着我們通過對象實例的地址得到這張虛函數表,然後就可以遍歷其中函數指針,並調用相應的函數。
測試程序:
輸出結果:
Base::a
Base::b
Base::c
我們可以通過強行把&b轉成int *,取得虛函數表的地址,然後,再次取址就可以得到第一個虛函數的地址了,也就是Base::a(),這在上面的程序中得到了驗證(把int* 強制轉成了函數指針)。通過這個示例,我們就可以知道如果要調用Base::b()和Base::c()
待續