让我们小结一下,面向对象多态性有两种不同的应用场景,而C++的标准多态技术只适合其中一种,对于另一种并不适合,必须以其他机制实现。
解决思路和建议
或许有读者读到这里,会对C++产生很大的怀疑。需要说明的是,C++选择的多态性实现技术是完全符合C++哲学的。而且,C++允许你以各种可能的办法来解决这个问题。时至今日,依靠各种成熟的GUI框架,大多数情况下我们可以自动绕过暗礁。
问题的严重性在于,由于C++教育上的问题,很多开发者对于C++原生多态技术在上述第二种应用场合中的局限性认识不足,因此当他们面临类似的问题时,会不自觉地踏入陷阱中。在此我愿提醒C++开发者,当你面对的
系统中含有标准的事件处理特征,而且事件数量较大时,请慎重考虑你的类层次结构设计。可以考虑模仿MFC或者Qt的解决方法,但在我看来,一个更加直接而且简单的方法是,模拟本文第1节中描述的、基于字符串比较的方法查找表,用一个单一的消息分发对象来向各个对象分发消息。由于这个消息分发对象会经常需要调整变化,将它单独放在一个DLL 甚至COM组件中,在运行时加载到
进程内。这种方案不是最精巧的,但是在大多数情况下有效,并且实现起来比较简单。限于篇幅,这里不详细描述。
事实上,我本人认为,C++语言应当从编译器上解决这个问题。基本思路为,当基类虚方法数量大而派生类改写的方法数量小的时候(这个信息可以从编译过程中得到),改变派生类对象的虚方法查找机制,改按位置查找为按被调用函数实际信息查找。这样一来,派生类中的虚方法表可不必与基类保持结构上的一致,从而避免了空间上的浪费。这种思路跟Delphi/Object Pascal语言中dynamic关键字有相似之处。本文不再赘述。

发表评论