for (VPW::iterator iter = winPtrs.begin(); iter != winPtrs.end(); ++iter)
{
if (SpecialWindow1 *psw1 = dynamic_cast(iter->get())) { ... }
else if (SpecialWindow2 *psw2 = dynamic_cast(iter->get())) { ... }
else if (SpecialWindow3 *psw3 = dynamic_cast(iter->get())) { ... }
...
}
这样的 C++ 会生成的代码又大又慢,而且很脆弱,因为每次 Window 类继续体系发生变化,所有这样的代码都要必须被检查,以确认是否需要更新。(例如,假如增加了一个新的派生类,在上面的极联中或许就需要加入一个新的条件分支。)看起来类似这样的代码应该总是用基于虚函数的调用的某种东西来替换。 好的 C++ 极少使用强制转型,但在通常情况下完全去除也不实际。例如,从 int 到 double 的强制转型,就是对强制转型的合理运用,虽然它并不是绝对必要。(那些代码应该被重写,声明一个新的类型为 double 的变量,并用 x 的值进行初始化。)就像大多数可疑的结构成分,强制转型应该被尽可能地隔离,典型情况是隐藏在函数内部,用函数的接口保护调用者远离内部的污秽的工作。