else if (SpecialWindow2 *psw2 = dynamic_cast(iter->get())) { ... }
else if (SpecialWindow3 *psw3 = dynamic_cast(iter->get())) { ... }
...
}
这样的 C++ 会生成的代码又大又慢,而且很脆弱,因为每次 Window 类继承体系发生变化,所有这样的代码都要必须被检查,以确认是否需要更新。(例如,如果增加了一个新的派生类,在上面的极联中或许就需要加入一个新的条件分支。)看起来类似这样的代码应该总是用基于虚函数的调用的某种东西来替换。 好的 C++ 极少使用强制转型,但在通常情况下完全去除也不实际。例如,从 int 到 double 的强制转型,就是对强制转型的合理运用,虽然它并不是绝对必要。(那些代码应该被重写,声明一个新的类型为 double 的变量,并用 x 的值进行初始化。)就像大多数可疑的结构成分,强制转型应该被尽可能地隔离,典型情况是隐藏在函数内部,用函数的接口保护调用者远离内部的污秽的工作。
Things to Remember
·避免强制转型的随时应用,特别是在性能敏感的代码中应用 dynamic_casts,如果一个设计需要强制转型,设法开发一个没有强制转型的侯选方案。
·如果必须要强制转型,设法将它隐藏在一个函数中。客户可以用调用那个函数来代替在他们自己的代码中加入强制转型。
·尽量用 C++ 风格的强制转型替换旧风格的强制转型。它们更容易被注意到,而且他们做的事情也更加明确。
|
您将承担一切因您的行为、言论而直接或间接导致的民事或刑事法律责任
留言板管理人员有权保留或删除其管辖留言中的任意内容 本站提醒:不要进行人身攻击。谢谢配合。 |