以下代码正确编译并获得神秘的输出:



(环境: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/

10-10 13:56