Gio*_*Gio -2 c++ polymorphism dynamic-cast
在查看从旧版本的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
}
Run Code Online (Sandbox Code Playgroud)
我相信作者已经正确设置了所有课程dynamic_cast<>()
.类c'是'a类似乎看起来很满意,而类c'是'类b'所以看起来很满意.
我想知道问题是否存在于a_
实际上是派生类B 的事实,理论上它实际上可以是指向假设类D的派生指针.我在我的c ++上生锈了,我可以在这里使用一些帮助来解决根本原因和正确的解决方案.
a_
指向一个b
.当你试图dynamic_cast<c*>(a_);
从中获取一个c
没有c
对象时,只有一个,b
所以转换失败并且你得到一个空指针.b_
因为工作b_
实际上指向了一个c
.