我听过好几次说,如果您需要动态下调,那么设计可能有问题。我将其视为类似于COMs queryinterface的机制,它在运行时查询对象以查看其支持的接口(interface),然后相应地调用适当的方法。

这有什么问题吗?

最佳答案

它没有内在的错误,有时是适当的,但是编写基于对象的动态类型进行决策的代码通常设计不佳。如果您有这样的事情:

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
  }
}

您最好将该功能作为虚拟函数放入派生类中,并让该语言的内置动态分派(dispatch)负责确定要运行的代码。这样,如果以后添加Derived3,则不必在代码中查找要检查DerivedDerived2的所有位置,也不必添加对Derived3的检查。只需在Derived3中实现虚拟函数,所有现有的虚拟函数调用都将起作用。

10-08 04:15