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

时间:2019-01-11 22:38:40

标签: c++ polymorphism dynamic-cast

在审查从Visual Studio的旧版本(6)移植到新版本(2017)的继承项目时,我们偶然发现了此运行时错误,因为在使用{{之后,我们得到了意外的NULL 1}}。这是一个代表性的示例:

给出以下代码:

dynamic_cast<>()

我相信作者已经为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 } 正确地设置了所有类。 c类是看起来很满意的a类,而c类是看起来很满意的b类。

我想知道问题是否出在dynamic_cast<>()实际上是派生的类b的事实上,从理论上说,它实际上是指向假设的类d的派生指针。 我对自己的c ++感到生疏,可以在这里就根本原因和适当的解决方案寻求帮助。

1 个答案:

答案 0 :(得分:6)

a_指向b。当您尝试dynamic_cast<c*>(a_);尝试从中获取c时,没有c对象,只有b,因此强制转换失败,并且您获得了空指针。 b_的工作是因为b_实际上指向c