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