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



在查看从旧版本的Visual Studio (6)移植到新版本(2017)的继承项目时,我们偶然发现了这个运行时错误,因为在基类上使用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<>()正确设置了所有类。C类"是"A类,所以这似乎很满意,而C类"是"B类,所以这似乎很满意。

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

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

最新更新