多型性 vptr和vtable

2021-04-12 17:51:27 字數 755 閱讀 2940

多型性 (polymorphi**) 是物件導向程式設計的基本特徵之一。而在c++ 中,多型性通過虛函式 (virtual function) 來實現。我們來看一段簡單的**:

#include

using namespace std;

class base

typedef void (*fun)();

它與base中的三個虛函式相似,為了簡單我們不要任何輸入和返回,我們只要知道它實際上被執行了即可。

然後,我們負責「摸瓜」的函式登場了:

fun getfun (base* obj, unsigned long off)

第乙個引數是base指標,我們可以輸入base或是base派生物件的指標。第二個引數是vtable偏移量,偏移量如果是0那麼對應fun1(),如果是1對應fun2()。getfun() 返回的是fun型別函式指標,我們上面定義的那個。可以看到,函式首先就對base指標呼叫了一次getp(),這樣得到了vptr這個指標,然後用乙個 unsigned char指標運算偏移量,得到的結果再次輸入getp(),這次得到的就應該是正確的函式體的位置了。

那麼它到底能不能正確工作呢?我們修改main() 來測試一下:

int main()

激動人心的時刻到來了,讓我們執行它!

執行結果為:

a::fun1()

a::fun2()

base::fun3()

至此,我們真的成功了。通過我們的方法,我們獲取了物件的vptr,在它的體外執行了它的虛函式。 

多型性 vptr和vtable

多型性 polymorphism 是物件導向程式設計的基本特徵之一。而在c 中,多型性通過虛函式 virtual function 來實現。我們來看一段簡單的 include using namespace std class base typedef void fun 它與base中的三個虛函式相...

c 多型性 vptr和vtable

多型性 polymorphism 是物件導向程式設計的基本特徵之一。而在 c 中,多型性通過虛函式 virtual function 來實現。我們來看一段簡單的 include using namespace std class base virtual void fun2 virtual void...

c 多型性 vptr和vtable

多型性 polymorphism 是物件導向程式設計的基本特徵之一。而在 c 中,多型性通過虛函式 virtual function 來實現。我們來看一段簡單的 include using namespace std class base 我們不考慮它漂亮與否,我們只是試驗。getp 可以從當前指標...