Dynamic_cast失败

lak*_*esh -3 c++ dynamic-cast

假设代码是这样的:

#include <iostream>

using namespace std;

class dog
{
 public:
   virtual ~dog()
   {

   }
};

class yellowdog : public dog
{
  int age;
  public:
    void bark() { cout << "woof." << endl;}
};

int main()
{
  dog *pd = new dog();
  yellowdog *py = dynamic_cast<yellowdog*>(pd);
  py->bark();
  cout << "py = " << py << endl;
  cout << "pd = " << pd << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

woof.
py = 0x0
pd = 0x7fd4d34000e0
Run Code Online (Sandbox Code Playgroud)

我明白了为什么PY = 0.我知道,有一个运行时检查,并在运行时检查,有一项不合格转换dogyellowdog,PY = 0,因此价值.

我的问题是为什么py->bark()仍然可以工作.为什么它仍然能够打印出"低音".

我以前对代码道歉.现在检查..

Joh*_*ica 7

py是一个空指针,因此py->bark()调用未定义的行为.任何事情都可能发生,包括似乎有效的事情.与Java或C#不同,如果访问空指针,C++无法保证立即失败.在效率方面,C++编译器通常会忽略空指针检查.

碰巧,bark()根本不使用this,所以它可以正常工作也就不足为奇了.你不应该依赖它 - 不能保证它会起作用 - 但这并不奇怪.

  • @lakesh _"如何避免这种未定义的行为?"_不要取消引用`nullptr`:P ... (3认同)