在审查从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 ++感到生疏,可以在这里就根本原因和适当的解决方案寻求帮助。
答案 0 :(得分:6)
a_
指向b
。当您尝试dynamic_cast<c*>(a_);
尝试从中获取c
时,没有c
对象,只有b
,因此强制转换失败,并且您获得了空指针。 b_
的工作是因为b_
实际上指向c
。