多级继承和dynamic_cast

时间:2012-07-13 11:39:17

标签: c++

首先背景:

我正在研究一些实现UI界面的遗留代码。代码的结构是它有一个基类(实际上它是一个结构)WinBase,然后派生到各种图形对象。

WinBase:
 - Button
 - DialogWin
 - (etc...)
 - EditWin

WinBase有一个成员WinBase **children,用于密切关注每个对象的所有子节点。这些子项在运行期间以标准的new [] / delete []方式创建和销毁。

这些对象的所有方法/函数都假设它们正在接收指向WinBase对象的指针,而dynamic_cast<>用于确保/验证正在使用的适当指针。

稍后对代码的更改添加了另外两个类/结构(ListBoxTextBox),这些类/结构派生自EditWin,后者又来自WinBase

所以......我有WinBase指向ListBoxTextBox的指针。正如我所说,dynamic_cast<>在整个代码中使用,但我不确定调用此构造函数时这是多么安全。

TextBox(WinBase *pw,(...));

直接从WinBase投放到ListBox,反之亦然(例如),安全性如何?

2 个答案:

答案 0 :(得分:0)

所以,如果dynamic_cast返回0,你可以尝试使用boost :: polymorphic_cast或boost :: polymorphic_downcast http://www.boost.org/doc/libs/1_50_0/libs/conversion/cast.htm它抛出异常。

答案 1 :(得分:0)

首先,为什么在WinBase给出期望ListBox的方法时,为什么要将ListBox投射到WinBase?如果您需要在那里进行强制转换,则应重新考虑设计,因为期望WinBase的方法应仅在WinBase's接口上运行。

当且仅当ListBox来自WinBase(直接或间接)时,您始终可以从ListBox*投射到WinBase*(或参考) ),因为ListBox IS A WinBase

反过来投射是不安全的,因为你永远不会知道你所获得的WinBase*实际上是ListBox*还是其他什么东西而且需要麻烦。您当然可以使用dynamic_cast<>来测试它是否真的是ListBox*,但任何动态演员都会要求您审核您的设计。

特别是那种向下转换会在构造函数中引发麻烦,因为当你没有得到你想要的东西时,你的代码应该做什么?抛出异常,唯一的出路并不是一个好主意,而是最好的avoided at all(除非你知道你在做什么)。