C ++中的动态向下转换有什么固有的错误吗?

时间:2012-03-15 00:40:13

标签: c++

我听过它曾多次说过,如果你需要动态下转,那么设计可能会出现问题。我将其视为COMs查询接口的类似机制,在运行时查询对象以查看它支持的接口,然后相应地调用相应的方法。

这有什么问题吗?

2 个答案:

答案 0 :(得分:3)

与编程语言的许多其他功能一样,有适当的用途(COM可能就是这种情况),但在大多数情况下,它表明您创建的类型层次结构不够丰富,无法满足您的需求(不提供)您需要的所有操作)或您正在强制与实际不相关的类型的继承关系(因此具有不同的操作集)。

请注意,这也是COM接口的情况,除了基本发布支持哪些接口外,这些对象几乎没有共享。但在这种特殊情况下,层次结构中不相关类型的绑定需要系统中定义的特定接口。

答案 1 :(得分:2)

如果您有这样的事情:

void foo(Base const *base) {
  Derived1 const *derived1 = dynamic_cast<Derived1 const *>(base);
  if (derived1) {
    // Do stuff
  }

  Derived2 const *derived2 = dynamic_cast<Derived2 const *>(base);
  if (derived2) {
    // Do stuff
  }
}

您可能最好将该功能作为虚拟函数放入派生类中,并让语言的内置动态调度负责确定要运行的代码。这样,如果您稍后添加Derived3,则无需在代码中找到要检查DerivedDerived2的所有位置,并添加支票Derived3也是如此。只需在Derived3中实现虚函数,所有现有的虚函数调用都可以。