为什么 dynamic_cast return null 具有多级继承

why does dynamic_cast return null with multiple level inheritance

在审查要从旧版本 Visual Studio (6) 移植到新版本 (2017) 的继承项目时,我们偶然发现了这个 运行 时间错误,因为我们在基数 class 上使用 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
}

我相信作者已经为 dynamic_cast<>() 正确设置了所有 classes。 Class c 'is a' Class a 这样看起来很满意,而 Class c 'is a' Class b 这样看起来很满意。

我想知道问题是否在于 a_ 实际上是派生的 Class b,理论上它实际上可能是指向假设的 Class 的派生指针d. 我对我的 C++ 生疏了,我可以在这里使用一些关于根本原因和适当解决方案的帮助。

a_指向一个b。当您尝试 dynamic_cast<c*>(a_); 尝试从中获取 c 时,没有 c 对象,只有 b 因此转换失败并且您得到一个空指针。 b_ 有效,因为 b_ 实际上指向 c.