我有一个基类如下:
function abc($cat_id) {
return (int)$cat_id * (int)$cat_id;
}
class Base{
public:
virtual void f() { cout << "Base::f" << endl; }
};
我想通过在虚拟表中使用void testVTable(){
typedef void (*Func)(void);
Base b;
Func pFunc = NULL;
cout<<"vtable address:"<<(int*)(&b)<<endl;
cout<<"virtual function address:"<<(int*)*(int*)(&b)<<endl;
pFunc = (Func)(int*)*(int*)((&b)+0);
pFunc();}
的地址来执行函数f()
。但是,在MacOS中,程序在Windows 7中运行时崩溃了。我知道{{1} }是8个字节,f
是4个字节,我尝试使用int *
替换int
,但它不起作用。
我无法让它发挥作用。有人能帮助我吗?
答案 0 :(得分:1)
即使你设法在vtable(这是另一个任务)中找到正确的函数指针偏移量,存储在那里的函数指针肯定不是常规函数指针。此外,它可能不是非静态成员函数指针,因此它不会起作用。
答案 1 :(得分:0)
试试这个:
void testVTable(){
typedef void (*Func)(void*);
Base b;
size_t vtblAddress = *(size_t*)&b;
Func pFunc = (Func)(*(size_t*)(vtblAddress));
pFunc(&b);
}
答案 2 :(得分:-1)
我终于通过使用vs2015调试发现我的代码有问题,下面是可以在vc6,vs2015和Xcode上正常运行的代码。
void testVTable(){
typedef void (*Func)(void);
Base b;
Func pFunc = NULL;
cout<<"vtable address:"<<(size_t*)(&b)<<endl;
cout<<"virtual function address:"<<(size_t*)*(size_t*)*(size_t*)(&b)<<endl;
pFunc = (Func)(size_t*)*(size_t*)*(size_t*)((&b)+0);
pFunc();}