C++ 为什么dynamic_cast使用多级继承返回null

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:

在查看从旧版本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: 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_
指向a
b
尝试从中获取
c
对象没有
c
对象,只有
b
因此强制转换失败,您得到一个空指针。
b
有效,因为
b
实际上指向a
c

不是问题,但您可以在所有派生类中摆脱
virtual
ted,不需要在派生类中显式声明。虽然我不确定为什么c_2为NULL…您期望的行为是什么?
a_u
指向a
b
,它不是
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
。这就是为什么您得到空指针的结果。