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

Does using a static_cast on a polymorphic object indicate a design flaw?

本文关键字:存在 缺陷 是否 cast 对象 多态 static      更新时间:2023-10-16

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

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

使用static_cast只比使用dynamic_cast更危险一点。只有当您要转换的类型确实正确时,才具有定义良好的行为。对于dynamic_cast,至少它会告诉您它是否不是。

与任何建议一样,总是有例外的。问问你自己基指针类型在这里是否合适。我们使用多态性表示"我们只想要Fruit !"我不管它是Apple还是Banana——我们对它们都一视同仁!"如果你没有像对待基类型那样对待所有的对象,你可能需要重新思考。正如Mark Ransom在他的回答中所举的例子,有时候你确实想用这种方式表达沮丧。

具有合法用途。如果没有它,奇怪循环模板模式(CRTP)是不可能的。

在我看来,这可能表明存在设计缺陷。如果你知道它是某种类型的派生类,为什么要把它作为基类传递呢?