为什么结果不在我的期望中
why the result is not in my expectation?
#include <iostream>
using namespace std;
typedef void (*pFun)(void);
class A
{
private:
int a;
int b;
virtual void outPrint()
{
cout << b << endl;
}
public:
A()
{
a = 3;
b = 4;
}
};
int main()
{
A obj;
cout << *((int*)(&obj)+1) << endl;
pFun pFunc;
pFunc = (pFun)*((int*)*(int*)(&obj));
pFunc();
system("pause");
return 0;
}
当我调用 pFunc(( 时,我认为结果应该是 4,但实际上它是一个随机数。我调试了程序,发现 pFunc 指向 outPrint 函数。我不知道为什么,请帮帮我
您假设对象obj
的地址可以解释为您定义的类型的函数的地址。
不能。
我不完全确定你为什么会有这样的假设。您可能正在假设有关动态调度的内部实现。但请注意:您希望调用A::outPrint
接受 1 个参数(this
,未明确定义(,而您的 typedef 假定没有参数。因此,即使地址转换工作正常,并且您获得的地址是成员函数的地址(这首先是一个延伸(,您的调用也是不正确的。
如果将 typedef 更改为:
typedef void (*pFun)(A*);
和呼吁
pFunc(&obj);
这也许可行。然而,据我所知,每个规范的行为是未定义的。
在int*
中添加 1 仅在遍历int[]
的情况下定义了行为。
在所有其他情况下,都没有定义应该发生什么。它是定义的实现,因为没有定义成员的最终内存位置。
尝试以不利用编译器详细信息而是利用标准的方式解决问题。
此外,如果您以这种方式获得函数地址,将其作为静态方法(没有对象(调用,只会给您带来一些麻烦。
我不太确定你到底想做什么。看起来您正在尝试直接操作指针以获取方法的地址,但由于大约 6 个不同的原因,这是一个非常糟糕的主意。可以获取指向类方法的指针,但它未绑定到对象,因此需要小心。
我建议你对指针和C++类有一个根本性的误解,在你安全地管理任何这些之前,必须纠正这些误解。大多数人不需要函数指针,几乎没有人需要方法指针。
您依赖于各种"未定义的行为",因此结果取决于您运行的编译器和平台。
(int*(&obj+1(最好写((int*(&obj(+1以避免误解(不一定是b
成员。成员之间可能有填充,&obj 可能与 obj &(obj.a)
多态对象不同(因此它可能在其顶部有一个 vtable 指针(。
在这种情况下,*(int*)&obj
vtable 地址被视为 int.将其转换为 int*
(假设 int 和指针具有相同的大小(,它指向第一个 vtable 条目(很可能是 outPrint 的地址(,因此是"随机数"。
- cmake在我的项目中所需的所有静态库都不成功
- 0-1背包代码中的错误.我的代码中有什么错误
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 在我的代码中,获得最大的Pair Wise产品C++和输出并不总是正确的
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- SFML 碰撞永远不会在我的系统中注册
- 我的代码中的意外价值以及我如何修复它
- 为什么 rand 不在我的代码中生成随机数?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 我的输出中有一个额外的 0,为什么会这样
- 无法找出我的代码中的内存泄漏
- 我的代码中有错误,未声明的标识符
- 在 fork() 之后,我在我的程序中不断得到相同的 pid
- 为什么我的 constexpr 对象在我的函数中不是 constexpr?
- 如何在我的项目中从 CMAKE 中的同一项目获取多个库
- 当使用我在一个函数、另一个函数中修改的数组时,在我的输出中得到一个奇怪的负数
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 我的类中几乎所有的构造函数和解构函数都被隐式定义为已删除?
- 为什么结果不在我的期望中