多型性 (polymorphism) 是物件導向程式設計的基本特徵之一。而在 c++ 中,多型性通過虛函式 (virtual function) 來實現。我們來看一段簡單的**:
#include
using namespace std;
class base
我們不考慮它漂亮與否,我們只是試驗。getp() 可以從當前指標獲取它指向的下乙個指標。如果我們能找到函式體的位址,用什麼來儲存它呢?我想應該用乙個函式指標:
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,在它的體外執行了它的虛函式。
c 多型性 vptr和vtable
多型性 polymorphism 是物件導向程式設計的基本特徵之一。而在 c 中,多型性通過虛函式 virtual function 來實現。我們來看一段簡單的 include using namespace std class base virtual void fun2 virtual void...
多型性 vptr和vtable
多型性 polymorphi 是物件導向程式設計的基本特徵之一。而在c 中,多型性通過虛函式 virtual function 來實現。我們來看一段簡單的 include using namespace std class base typedef void fun 它與base中的三個虛函式相似,...
多型性 vptr和vtable
多型性 polymorphism 是物件導向程式設計的基本特徵之一。而在c 中,多型性通過虛函式 virtual function 來實現。我們來看一段簡單的 include using namespace std class base typedef void fun 它與base中的三個虛函式相...