1. 程式人生 > >c++手動用指針調用虛表中的函數

c++手動用指針調用虛表中的函數

指針 virtual iostream clu fun ostream 第一個 img blog

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++手動用指針調用虛表中的函數