"dynamic_cast"之后的NULL指针实际上是否可以取消引用?

Ric*_*ard 4 c++ visual-studio-2010 visual-c++

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

特殊投资功能00000000

(环境: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;
}
Run Code Online (Sandbox Code Playgroud)

怎么会这样?取消引用NULL指针并获得"正确"输出而不是崩溃?它是VS2010的特殊"特征"吗?

现在我明白了.我做了一个测试,似乎在"特殊"功能中解除引用"this"会导致程序崩溃.

谢谢你的帮助.

sha*_*oth 7

取消引用空指针是未定义的行为 - 您可以获得意外的结果.看到这个非常相似的问题.

在这种情况下Investment::special(),以非虚方式调用,因此您可以认为编译器只是创建了一个全局函数

Investment_special_impl( Investment* this )
Run Code Online (Sandbox Code Playgroud)

并调用它传递一个空this指针作为隐式参数.

你不应该依赖于此.