gpt4 book ai didi

c++ - 无效 C 风格强制转换后的方法调用

转载 作者:行者123 更新时间:2023-11-30 01:10:13 26 4
gpt4 key购买 nike

所以我想更多地了解 C-style-castsstatic_castdynamic_cast 和我决定尝试这个应该反射(reflect) C-style-casts 之间差异的示例和 static_cast 非常好。

class B
{
public:
void hi() { cout << "hello" << endl; }
};

class D: public B {};

class A {};

int main()
{
A* a = new A();
B* b = (B*)a;
b->hi();
}

这个代码片段应该反射(reflect)出 C-style-cast 非常错误并且根本没有检测到错误的转换。部分情况是这样发生的。未检测到错误转换,但令我惊讶的是程序并没有在 b->hi(); 处崩溃,而是在屏幕上打印了“hello”一词。

现在,为什么会这样?当没有实例化 B 对象时,使用什么对象调用这样的方法?我正在使用 g++ 进行编译。

最佳答案

正如其他人所说,这是未定义的行为。

为什么它起作用了?这可能是因为函数调用是在编译时静态链接的(它不是虚函数)。函数 B::hi() 存在所以被调用。尝试将变量添加到 class B 并在函数 hi() 中使用它。然后你会在屏幕上看到问题(垃圾值):

class B
{
public:
void hi() { cout << "hello, my value is " << x << endl; }

private:
int x = 5;
};

否则,您可以使函数 hi() 成为虚拟函数。然后函数在运行时动态链接,程序立即崩溃:

class B
{
public:
virtual void hi() { cout << "hello" << endl; }
};

关于c++ - 无效 C 风格强制转换后的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38608756/

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