gpt4 book ai didi

casting - 在 C++ 中转换指针后访问类的成员

转载 作者:行者123 更新时间:2023-12-02 20:27:51 24 4
gpt4 key购买 nike

我是 C++ 新手。谁能告诉我为什么下面的源代码运行良好?

#include <iostream>

using namespace std;

class A{
public:
A(){ cout << "create a" << endl; }
void sayGoodbye() { cout << "goodbye" << endl; }
};

class B{
public:
B() { cout << "create b" << endl; }
void sayHello() { cout << "hello" << endl; }
};

int main(array<System::String ^> ^args)
{
A* a = new A();

((B*)a)->sayHello();
a->sayGoodbye();

return 0;
}

输出:

create a
hello
goodbye

我想知道为什么 a 可以通过这样的强制转换来访问 B::sayHello ?它可以通过这种方式访问​​任何类的每个公共(public)成员吗?

最佳答案

是的,可以。

但是,不,你不能。

当您使用这样的 C 风格强制转换时,您向计算机保证您知道自己在做什么,并且强制转换是有效的。当它有效时,就可以了。如果不是,那就是的错。

在这种情况下,事实并非如此,这是你的错。

现在,您可以问为什么它“运行良好”,但这是偶然的:这纯粹是偶然的。一旦程序被编译,如果您确实访问了无效内存,它只会导致崩溃或谋杀您的继子。在这种特殊情况下,您没有访问无效内存。

但这并不意味着你是对的。

不要这样做。

关于casting - 在 C++ 中转换指针后访问类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30565306/

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