为什么dynamic_cast返回带有多级继承的null

Gio*_*Gio -2 c++ polymorphism dynamic-cast

在查看从旧版本的Visual Studio(6)移植到新版本(2017)的继承项目时,我们偶然发现了这个运行时错误,因为我们在使用dynamic_cast<>()基类后得到了意外的NULL .这是一个代表性的样本:

鉴于此代码:

class a { public: a() {}; virtual ~a() {}; };

class b :public a { public: b() {};  virtual ~b() {}; };

class c : public b { public: c() {};  virtual ~c() {}; };

int main()
{
    a *a_ = new b();
    b *b_ = new c();
    c *c_1 = dynamic_cast<c*>(b_); //<-- returns c_1 = non-null(actual pointer value)
    c *c_2 = dynamic_cast<c*>(a_); //<-- returns c_2 = NULL
}
Run Code Online (Sandbox Code Playgroud)

我相信作者已经正确设置了所有课程dynamic_cast<>().类c'是'a类似乎看起来很满意,而类c'是'类b'所以看起来很满意.

我想知道问题是否存在于a_实际上是派生类B 的事实,理论上它实际上可以是指向假设类D的派生指针.我在我的c ++上生锈了,我可以在这里使用一些帮助来解决根本原因和正确的解决方案.

Nat*_*ica 6

a_指向一个b.当你试图dynamic_cast<c*>(a_);从中获取一个c没有c对象时,只有一个,b所以转换失败并且你得到一个空指针.b_因为工作b_实际上指向了一个c.

  • @Gio:"跟随RTTI链"去哪里?你的`a_`不是`c`.没有"RTTI链"从"a_"导致`c`对象."遵循RTTI链"实际上就是`dynamic_cast`试图做的事情.那条链没有导致`c`.这就是为什么你得到空指针作为结果. (2认同)