以下代码正确编译并获得神秘的输出:
(环境:C++ VS2010)
#include <iostream>
#include <vector>
using namespace std;
class Security {
public:
virtual ~Security() {}
};
class Stock : public Security {};
class Investment : public Security {
public:
void special() {
cout << "special Investment function" << endl;
}
};
int main() {
Security* p = new Stock;
dynamic_cast<Investment*>(p)->special();
cout << dynamic_cast<Investment*>(p) << endl;
return 0;
}
怎么会这样?取消引用NULL指针并获得“正确”输出而不是崩溃?
它是VS2010的特殊“特征”吗?
现在我明白了。我进行了测试,看来在“特殊”功能中取消引用“this”会导致程序崩溃。
谢谢你的帮助。
最佳答案
取消引用空指针是未定义的行为 - 您可能会得到意想不到的结果。见 this very similar question 。
在这种情况下 Investment::special()
以非虚拟方式调用,因此您可以认为编译器只是创建了一个全局函数
Investment_special_impl( Investment* this )
并调用它传递一个空的
this
指针作为隐式参数。你不应该依赖这个。
关于c++ - "dynamic_cast"之后的 NULL 指针实际上可以取消引用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6248631/