C++ 虛函數表 Review

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()

 

待續

發佈了24 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章