为什么 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
.
在审查要从旧版本 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
.