我听过好几次说,如果您需要动态下调,那么设计可能有问题。我将其视为类似于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
,则不必在代码中查找要检查Derived
或Derived2
的所有位置,也不必添加对Derived3
的检查。只需在Derived3
中实现虚拟函数,所有现有的虚拟函数调用都将起作用。