如何处理警告:从较小的整数类型int转换为int *

时间:2017-11-08 10:44:09

标签: c++ pointers vtable

我有一个基类如下:

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,但它不起作用。 我无法让它发挥作用。有人能帮助我吗?

3 个答案:

答案 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();}