虛函數表!!!!

通過虛函數可以實現多態,即通過指針可以找到對象的虛函數,這是因爲創建對象的時候增加了虛函數表。
ps:當對象中有虛函數時,內存中存的第一個數據是一個指向虛函數表的地址。(當計算對象大小時需要注意含不含虛函數)另外如果一個類中什麼都沒有,這個類創建出來的對象大小爲1。

當一個類中有虛函數時,在創建該類對象時會額外創建一個數組,數組中的
每一個元素都是一個虛函數的入口地址,通過這個地址可以找到虛函數。
這個數組和對象的成員變量分開存儲,通過在對象中插入一個指向這個數組
指針將對象和數組聯繫起來。這個數組就是虛函數表(vtable)

在這裏插入圖片描述
左半部分是對象佔用的內存,右半部分是虛函數表 vtable。在對象的開頭位置有一個指針 vfptr,指向虛函數表,並且這個指針始終位於對象的開頭位置。

基類的虛函數在 vtable 中的索引(下標)是固定的,不會隨着繼承層次的增加而改變,派生類新增的虛函數放在 vtable 的最後。如果派生類有同名的虛函數遮蔽(覆蓋)了基類的虛函數,那麼將使用派生類的虛函數替換基類的虛函數,這樣具有遮蔽關係的虛函數在 vtable 中只會出現一次。

當通過指針調用虛函數時,先根據指針找到 vfptr,再根據 vfptr 找到虛函數的入口地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章