2

先说一些背景:

我正在研究一些实现 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,(...));

直接从WinBaseto 转换ListBox和反之亦然(例如)有多安全?

4

2 回答 2

0

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

于 2012-07-13T11:50:52.647 回答
0

首先,当 a被赋予期望 a 的方法时,为什么要将WinBasea强制转换为 a ?如果你需要一个演员,你应该重新考虑设计,因为期望的方法应该只在接口上运行。ListBoxListBoxWinBaseWinBaseWinBase's

当且仅当,ListBox派生自WinBase(直接或间接),您总是可以从 aListBox*转换为 a WinBase*(或引用),因为 ListBox是 A WinBase

反过来铸造是不安全的,因为你永远不会知道WinBase*你得到的实际上是 aListBox*还是其他东西,这会带来麻烦。您当然可以使用dynamic_cast<>它来测试它是否真的是ListBox*.,但是任何动态转换都需要对您的设计进行审查。

尤其是这种向下转换会在构造函数中带来麻烦,因为当你没有得到你想要的东西时,你的代码应该做什么?抛出异常,因为唯一的出路不是一个好主意,最好完全避免(除非你知道你在做什么)。

于 2012-07-13T11:51:44.073 回答