C++ 为什么dynamic_cast使用多级继承返回null
在查看从旧版本Visual Studio(6)移植到新版本(2017)的继承项目时,我们偶然发现了这个运行时错误,在基类上使用C++ 为什么dynamic_cast使用多级继承返回null,c++,polymorphism,dynamic-cast,C++,Polymorphism,Dynamic Cast,在查看从旧版本Visual Studio(6)移植到新版本(2017)的继承项目时,我们偶然发现了这个运行时错误,在基类上使用dynamic\u cast()后,我们得到了一个意外的空值。以下是一个具有代表性的样本: 鉴于此代码: class a { public: a() {}; virtual ~a() {}; }; class b :public a { public: b() {}; virtual ~b() {}; }; class c : public b { public:
dynamic\u 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
}
class a{public:a(){};virtual~a(){};};
b类:公共a{public:b(){};虚拟~b(){};};
类c:public b{public:c(){};virtual~c(){};};
int main()
{
a*a=新的b();
b*b_=新的c();
c*c_1=dynamic_cast(b_);/a_
指向ab
尝试从中获取c
对象没有c
对象,只有b
因此强制转换失败,您得到一个空指针。b
有效,因为b
实际上指向ac不是问题,但您可以在所有派生类中摆脱virtual
ted,不需要在派生类中显式声明。虽然我不确定为什么c_2为NULL…您期望的行为是什么?a_u
指向ab
,它不是c
,因此返回nullptr
是正确的。您是否执行动态_cast来创建新的c
对象?它不起作用这样。正如我在下面补充的,我有一个“不清晰”的时刻……叹气。我被“是a”的方面所困扰。但这就是为什么正确吗?感谢所有的帮助。我明白了:不能保证a指向c对象。无法通过那个,尽管我确实想知道dynamic_cast方法是否不能遵循RTTI链。@Gio它不是关于保证,重要的是,事实上,在执行动态强制转换时,a
没有指向c
对象。@Gio保证不会指向您显示的代码中的c
对象。几分钟后,我现在明白了:正如所指出的,a指向b对象,仅此而已。对不起,slow Upposition-试图编辑我的上一条评论,但超时。@Gio:“跟随RTTI链”到哪里?您的a_
不是c
。没有“RTTI链”从a_
跟随RTTI链而指向c
对象实际上正是dynamic\u cast
试图做的事情。而该链并没有导致c
。这就是为什么您得到空指针的结果。