c++手動用指針調用虛表中的函數
阿新 • • 發佈:2018-02-09
指針 virtual iostream clu fun ostream 第一個 img blog 1。調用基類中的函數.用一個指針保存基類的地址然後。使他指向虛表。再強轉成函數指針。
2.調用子類中的函數。用一個基類指針保存子類地址。然後和 1一樣。
2.調用子類中的函數。用一個基類指針保存子類地址。然後和 1一樣。
#include<iostream> using namespace std; class bass { public: virtual void fun() { cout << "bass" << endl; } }; class sun :public bass { public: void fun() { cout << "sun" << endl; } }; int main() { bass bass1; bass1.fun(); sun sun1; sun1.fun(); bass* pbass; pbass = &sun1; pbass->fun(); //void(*p)(); cout << sizeof(bass) << endl; int* add1 = (int*)&bass1;//指向對象bass1的指針 int* add2 = (int*)*add1;//指向虛函數表的指針 (*(void(*)())(*add2))();//強轉函數指針(函數與類型與虛函數類型一致) int* add3 = (int*)pbass;//基類指針指向子類 pbass=&sun1; int* add4 = (int*)*add3;//指向虛函數表的指針 (*(void(*)())(*add4))(); cout << hex << ((int*)(*((int*)&sun1))) << endl;//虛表中第一個函數地址也就是基類的函數地址 cout << hex << ((int*)(*((int*)&sun1)) + 1) << endl;//虛表中第二個函數地址也就是子類的函數地址 cin.get(); }
這裏用的是 vs2017 版 同時在 xcode9 中編譯通過運行出錯。同時只要是類型之間轉換。會非常嚴格。
c++手動用指針調用虛表中的函數