首先背景:
我正在研究一些实现UI界面的遗留代码。代码的结构是它有一个基类(实际上它是一个结构)WinBase,然后派生到各种图形对象。
WinBase:
- Button
- DialogWin
- (etc...)
- EditWin
WinBase有一个成员WinBase **children
,用于密切关注每个对象的所有子节点。这些子项在运行期间以标准的new [] / delete []方式创建和销毁。
这些对象的所有方法/函数都假设它们正在接收指向WinBase
对象的指针,而dynamic_cast<>
用于确保/验证正在使用的适当指针。
稍后对代码的更改添加了另外两个类/结构(ListBox
和TextBox
),这些类/结构派生自EditWin
,后者又来自WinBase
。
所以......我有WinBase
指向ListBox
和TextBox
的指针。正如我所说,dynamic_cast<>
在整个代码中使用,但我不确定调用此构造函数时这是多么安全。
TextBox(WinBase *pw,(...));
直接从WinBase
投放到ListBox
,反之亦然(例如),安全性如何?
答案 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(除非你知道你在做什么)。