gpt4 book ai didi

c++ - 将 int 指针转换为任何对象指针,然后调用它的方法。有用

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:08 24 4
gpt4 key购买 nike

我在C++中遇到一些奇怪的事情,但我不知道为什么?

我有这样一个类

头文件

class foo
{
public:
void call_foo();

int get_foo();

int get_foo(int val);
};

这是cpp文件

#include "foo.h"
#include <iostream>

using namespace std;

void foo::call_foo()
{
int i = 0;
int j = 33;
cout << i + j << endl;
cout << "Hello, Foo" << endl;
}

int foo::get_foo(int val)
{
int a = 345;
int rc = val + a;
cout << rc << endl;
return rc;
}

int foo::get_foo()
{
int a = 100;
int d = 23;
int rc = a + d;

cout << rc << endl;
return rc;
}

我使用如下代码进行测试

int main()
{
int* val = new int[100];

foo* foo_ptr;
foo_ptr = (foo*)val;
foo_ptr->call_foo();
foo_ptr->get_foo();
foo_ptr->get_foo(100);

delete [] val;
return 0;
}

然后我编译并执行它。

clang++ foo.cpp main.cpp

Apple LLVM 版本 5.0 (clang-500.2.79)操作系统 x 10.9

将一个 int 指针转换为一个对象指针,然后调用它的方法,成功了!太奇怪了!有人知道这是怎么回事吗?

我在 my blog 上写了一篇文章关于为什么它在我的理解中起作用,谢谢大家!关于对象结构,虚函数表。只有中文版:)

最佳答案

您遇到的情况称为未定义行为。

未定义行为意味着“任何事情都可能发生”。 任何事情在这里都包括您的代码有效、做了您期望它做的事情,或者没有做您期望它做的事情的错觉——比如崩溃。 p>

引起未定义行为的代码总是错误代码。你不能依赖未定义的行为,如果仅仅是因为你无法预测会发生什么。

现在在这种情况下,调用这些方法似乎有效的原因是因为在实践中,一个类的实例并没有为每个非static 获取它自己的代码拷贝> 方法。相反,foo 的所有实例之间共享一份代码拷贝。指向该代码的指针永远不会改变,因此当您(错误地)解析指向 foo 的指针,然后通过该指针调用其中一个方法时,您期望调用的实际方法实际上被调用了。然而,这仍然是未定义的行为,您需要修复您的代码。

关于c++ - 将 int 指针转换为任何对象指针,然后调用它的方法。有用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19688638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com