在多态对象上使用static_cast是否表明存在设计缺陷?

时间:2013-04-19 19:50:24

标签: c++

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

3 个答案:

答案 0 :(得分:5)

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

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

与任何建议一样,总有例外。只要问问自己这里的基本指针类型是否合适。我们使用多态来说“我们只想要Fruit!我不在乎它是Apple还是Banana - 我们会对它们一视同仁!”如果您没有将所有对象视为基类型,那么您可能想重新思考一下。正如Mark Ransom在他的回答中给出了一个例子,有时候你确实想要以这种方式贬低。

答案 1 :(得分:5)

它有合法用途。没有它,Curiously Recurring Template Pattern (CRTP)是不可能的。

答案 2 :(得分:0)

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