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

C++ 如何处理警告:从较小的整数类型int转换为int*,c++,pointers,vtable,C++,Pointers,Vtable,我有一个基类,如下所示: 类基{ 公众: 虚拟void f(){cout即使您设法在vtable中找到正确的函数指针偏移量(这是另一个任务)存储在那里的函数指针肯定不是常规函数指针。此外,它也可能不是非静态成员函数指针,因此无法工作。即使您在vtable中找到了正确的函数指针偏移量(这是另一个任务)存储在那里的函数指针肯定不是常规函数指针。此外,它也可能不是非静态成员函数指针,因此无法工作。请尝试以下操作: void testVTable(){ typedef void (*Func)(

我有一个基类,如下所示:

类基{
公众:

虚拟void f(){cout即使您设法在vtable中找到正确的函数指针偏移量(这是另一个任务)存储在那里的函数指针肯定不是常规函数指针。此外,它也可能不是非静态成员函数指针,因此无法工作。

即使您在vtable中找到了正确的函数指针偏移量(这是另一个任务)存储在那里的函数指针肯定不是常规函数指针。此外,它也可能不是非静态成员函数指针,因此无法工作。

请尝试以下操作:

void testVTable(){
    typedef void (*Func)(void*);
    Base b;
    size_t vtblAddress = *(size_t*)&b;
    Func pFunc = (Func)(*(size_t*)(vtblAddress));
    pFunc(&b);
}
试试这个:

void testVTable(){
    typedef void (*Func)(void*);
    Base b;
    size_t vtblAddress = *(size_t*)&b;
    Func pFunc = (Func)(*(size_t*)(vtblAddress));
    pFunc(&b);
}

通过使用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();}
void testVTable(){
类型定义无效(*Func)(无效);
碱基b;
Func pFunc=NULL;

cout通过使用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();}
void testVTable(){
类型定义无效(*Func)(无效);
碱基b;
Func pFunc=NULL;

明白为什么(见鬼)你想这样做吗?这是十次以上未定义的行为…我只想测试vtable并了解更多有关虚拟函数的信息!好吧,你必须了解不同的编译器ABI。我猜你在Windows上使用MSVC,但Mac OS通常使用Clang。他们没有理由以相同的方式实现虚拟调度,这是事实ct他们没有——因此,崩溃了。为什么(见鬼)你想这样做吗?这是十次以上未定义的行为…我只想测试vtable并了解更多有关虚拟函数的信息!好吧,你必须了解不同的编译器ABI。我猜你在Windows上使用MSVC,但Mac OS通常使用Clang。他们没有理由以相同的方式实现虚拟调度,这是事实ct他们没有——因此,崩溃。谢谢。你的答案看起来比我的好,更清楚易懂!谢谢。你的答案看起来比我的好,更清楚易懂!