C++面試題-多態的實現原理

C++面試題目

C++中多態的實現原理是什麼

解決方案

關於多態,簡而言之就是用父類型別的指針指向其子類的實例,然後通過父類的指針調用實際子類的成員函數。對C++瞭解的人都應該知道多態調用是通過虛函數表(Virtual Table)來實現的。

簡單地說,每一個含有虛函數(無論是其本身的,還是繼承而來的)的類都至少有一個與之對應的虛函數表,其中存放著該類所有的虛函數對應的函數指針。

C++面試題-多態的實現原理

其中:

B的虛函數表中存放著B::foo和B::bar兩個函數指針。

D的虛函數表中存放的既有繼承自B的虛函數B::foo,又有重寫(override)了基類虛函數B::bar的D::bar,還有新增的虛函數D::quz。

虛函數的調用

C++面試題-多態的實現原理

編譯器只知道pb是B*類型的指針,並不知道它指向的具體對象類型 :pb可能指向的是B的對象,也可能指向的是D的對象。

但對於pb->bar(),編譯時能夠確定的是:此處operator->的另一個參數是B::bar(因為pb是B*類型的,編譯器認為bar是B::bar),而B::bar和D::bar在各自虛函數表中的偏移位置是相等的。無論pb指向哪種類型的對象,只要能夠確定被調函數在虛函數中的偏移值,待運行時,能夠確定具體類型,並能找到相應vptr了,就能找出真正應該調用的函數,從而實現多態。


分享到:


相關文章: