1. 程式人生 > >C++ 多態的實現原理

C++ 多態的實現原理

編譯 實現原理 父類 調用 blog 區分 所有 存儲 print

  • 當類中聲明虛函數時,編譯器會在類中生成一個虛函數表
  • 虛函數表是一個存儲類成員函數指針的數據結構
  • 虛函數表是由編譯器自動生成與維護的
  • virtual成員函數會被編譯器放入虛函數表中
  • 存在虛函數時,每個對象中都有一個指向虛函數表的指針(vptr指針)

技術分享

技術分享

技術分享

說明1:通過虛函數表指針VPTR調用重寫函數是在程序運行時進行的,因此需要通過尋址操作才能確定真正應該調用的函數。而普通成員函數是在編譯時就確定了調用的函數。在效率上,虛函數的效率要低很多。

說明2:出於效率考慮,沒有必要將所有成員函數都聲明為虛函數。

說明3 :C++編譯器,執行HowToPrint函數,不需要區分是子類對象還是父類對象。

技術分享

C++ 多態的實現原理