在x64下使用longlong类型保存虚函数指针,在x86下使用int保存指针,如果是x86,把long long vTable改成int vTable,后面的依次修改
#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define l(x) x<<1
#define r(x) x<<1|1
#define ms(a,b) memset(a,b,sizeof(a))
using namespace std;
class A{
public:
virtual void f() { cout << "A1::f" << endl; }
virtual void g() { cout << "A1::g" << endl; }
virtual void h() { cout << "A1::h" << endl; }
};
class B : public A{
public:
virtual void f() { cout << "B::f" << endl; }
virtual void g() { cout << "B::g" << endl; }
virtual void h() { cout << "B::h" << endl; }
};
typedef void(*FUNC)();
void PrintVTable(A* demo)
{
long long *vTable = (long long *)(*(long long*)demo);
if (vTable == NULL)
{
return;
}
cout << "vtbl:" << vTable << endl;
int i = 0;
for (; vTable[i] != 0; ++i)
{
printf("function : %d :0X%x->", i, vTable[i]);
FUNC f = (FUNC)vTable[i];
f();
}
cout << endl;
}
int main() {
B *b = new B();
PrintVTable(b);
return 0;
}