虛函數表
虛函數表
虛函數表是一塊連續的內存,每個內存單元中記錄一個JMP指令的地址。
目錄
C++中的虛函數的實現一般是通過虛函數表(C++規範並沒有規定具體用哪種方法,但大部分的編譯器廠商都選擇此方法)。
類的虛函數表是一塊連續的內存,每個內存單元中記錄一個JMP指令的地址。
注意的是,編譯器會為每個有虛函數的類創建一個虛函數表,該虛函數表將被該類的所有對象共享。類的每個虛成員佔據虛函數表中的一行。如果類中有N個虛函數,那麼其虛函數表將有N*4位元組的大小。
虛函數(Virtual Function)是通過一張虛函數表來實現的。簡稱為V-Table。在這個表中,主要是一個類的虛函數的地址表,這張表解決了繼承、覆蓋的問題,保證其真實反應實際的函數。這樣,在有虛函數的類的實例中分配了指向這個表的指針的內存,所以,當用父類的指針來操作一個子類的時候,這張虛函數表就顯得尤為重要了,它就像一個地圖一樣,指明了實際所應該調用的函數。
編譯器應該是保證虛函數表的指針存在於對象實例中最前面的位置(這是為了保證取到虛函數表的有最高的性能——如果有多層繼承或是多重繼承的情況下)。這意味著可以通過對象實例的地址得到這張虛函數表,然後就可以遍歷其中函數指針,並調用相應的函數。