虛函數表完成了C++編譯器對於虛函數的實現方式,即dynamic binding,為了達到動態綁定(後期綁定)的目的,C++編譯器通過某個表格,再執行期“間接”調用實際上欲綁定的函數。這樣的表格成為虛函數表vtable)
每一個“內含虛函數的類”,編譯器都會為它做出一個虛函數表,表中的每一個元素都指向一個虛函數的地址。
此外,編譯器也會為類加上一項成員變量,是一個指向該虛函數的指針(vptr),每一個包含虛函數的類,派生出來的對象,都有這麼一個vptr。當我們用這個對象調用虛函數時,事實上是通過vptr找到虛函數表,再找出虛函數的真正地址。
虛函數表的內容是依據類中的虛函數聲明次序,一一填入函數指針。派生類會繼承基類的虛函數表(以及所有其它可以繼承的成員),當我們再派生類中改寫虛函數時,虛函數表就受了影響:表中元素所指的函數地址將不再是基類的函數地址,而是派生類的函數地址。
作者“志在千裡”