1

我知道应该避免 dynamic_cast,但是假设我的程序中有一个 Base 类的对象 x,我知道在执行的某个时刻它也是 Derived 类(继承自 Base)。使用 static_cast 向下转换以调用派生方法等是否可以接受?或者这是否表明存在设计缺陷?

4

3 回答 3

5

它表明与使用将完全相同的设计缺陷dynamic_cast。事实是,如果您使用指向基类的指针,则应该意味着您只使用传递的对象,就好像它们是该基类一样。如果您必须确定对象的动态派生类型,那么您可能不应该使用指向 base 的指针。

使用 astatic_cast只是比使用 更危险一点dynamic_cast。如果您要转换的类型确实是正确的,那么您只有明确定义的行为。使用 a dynamic_cast,至少它会告诉您是否不是。

与任何建议一样,总会有例外。问问自己,基指针类型在这里是否真的合适。我们使用多态性来表示“我们只是想要Fruit!我不在乎它是 anApple还是 a Banana- 我们会一视同仁地对待它们!” 如果您没有将所有对象都视为基本类型,那么您可能需要重新考虑。正如 Mark Ransom 在他的回答中给出的一个例子,有时你真的想以这种方式沮丧。

于 2013-04-19T20:01:50.983 回答
5

它有合法用途。没有它,奇怪的重复模板模式 (CRTP)将是不可能的。

于 2013-04-19T20:03:25.880 回答
0

imo 是的,它可能表明存在设计缺陷。如果您知道它是某种类型的派生类,为什么将其作为基类传递?

于 2013-04-19T19:56:57.903 回答