详解虚函数的实现过程之虚基类(4)
博客虛函數(shù)實現(xiàn)過程3 時提到過虛基類,這里呢,我們來詳細講述一下:
當我們在虛函數(shù)的聲明結(jié)尾處添加“=0”,這種虛函數(shù)就被稱為純虛函數(shù)。
它好似一個沒有實現(xiàn)只有聲明的函數(shù),它的存在就是為了讓類具有抽象類的功能,讓繼承自抽象類的子類都有虛表和虛表指針。
使用過程中,利用抽象類指針可以更好地完成多態(tài)工作。
如下分析:
大家想一想,只有聲明卻沒有實現(xiàn)的函數(shù),它的虛表指針指向的函數(shù)那是什么玩意?它還是指向一個函數(shù)指針嗎?這個函數(shù)指針指向的地方是哪里呢?會不會是空?里面難不成放了一個null?還是放了一個報錯?或者直接指向其它函數(shù)?等等疑問,如何解決呢?我們直接通過底層匯編代碼來分析就可以看出來嘍。
它的虛表指針指向了425068(從地址401830所看出來的),接下來我們探索425068地址去看看那里有個啥呢?
哇哦,原來是一個 指針,指向的地方是401E90,它是一個函數(shù)_purecall,它用于結(jié)束程序,并發(fā)出錯誤編碼信息0x19。
如果當我們定義了多個純虛函數(shù)時,那么虛表里面存放的是函數(shù)指針內(nèi)容是不是一樣的呢?
兩個純虛函數(shù)都是函數(shù)_purecall,所以一切都清晰嘍。
總結(jié):
由于純虛函數(shù)沒有實現(xiàn)代碼,因此沒有首地址。編譯器為了防止誤調(diào)用純虛函數(shù),將虛表中保存的純虛函數(shù)的首地址換成函數(shù)_purecall,它用于結(jié)束程序,并發(fā)出錯誤編碼信息0x19。
根據(jù)這一特性,在分析過程中,一旦在虛表中發(fā)現(xiàn)函數(shù)地址為_purecall函數(shù)的地址時,我們就可以高度懷疑此虛表對應(yīng)的類是一個虛基類。
虛函數(shù)系列:
詳解虛函數(shù)的實現(xiàn)過程之初探虛表(1)
詳解虛函數(shù)的實現(xiàn)過程之單繼承(2)
詳解虛函數(shù)的實現(xiàn)過程之多重繼承(3)
詳解虛函數(shù)的實現(xiàn)過程之虛基類(4)
詳解虛函數(shù)的實現(xiàn)過程之菱形繼承(5)
總結(jié)
以上是生活随笔為你收集整理的详解虚函数的实现过程之虚基类(4)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解虚函数的实现过程之多重继承(3)
- 下一篇: 详解虚函数的实现过程之菱形继承(5)