多型性 (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 可以從當前指標...