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他们没有——因此,崩溃。谢谢。你的答案看起来比我的好,更清楚易懂!谢谢。你的答案看起来比我的好,更清楚易懂!