能否通过强制转换从类指针获取成员函数?(VS2019环境)
问题解答
首先,你代码里的核心逻辑完全错误:void *v = (void *)((ptr + i)->x);这一步是把成员变量x的数值(比如i*11)强制转换为指针,这和成员函数x1的地址没有任何关系,属于完全错误的方向。
针对你提出的“通过强制转换从类指针获取成员函数的操作是否允许”这个问题,分以下几点说明:
非静态成员函数指针和普通指针的本质区别:非静态成员函数需要依赖类的对象(隐含传递
this指针),因此它的指针类型和普通函数指针、void*是完全不同的类型。C++标准明确禁止将非静态成员函数指针转换为普通函数指针或void*,这种转换属于未定义行为——即使VS2019可能支持某些非标准扩展,也绝对不应该这么做。正确获取并调用成员函数的方式:如果你想获取并调用
x1成员函数,应该使用成员函数指针类型,示例代码如下:
// 定义成员函数指针类型 typedef int (myclass::*MemFuncPtr)(); // 获取成员函数地址 MemFuncPtr func = &myclass::x1; // 遍历数组并调用成员函数 for (int i = 0; i < 10; i++) { std::cout << ((ptr + i)->x) << std::endl; // 调用成员函数 int result = ((ptr + i)->*func)(); std::cout << result << std::endl; }
- 你当前代码的致命问题:你试图把成员变量的数值当成函数指针来用,这不仅逻辑错误,而且将整数转换为指针的行为本身就是未定义的——得到的指针指向的内存区域根本不是
x1函数的代码段,调用它会直接导致程序崩溃或其他不可预测的行为。
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

