MFC使用一种有效的方式来处理与虚函数有关的空间消耗和复杂性问题。例如,下面的图像演示了如何获取类层次结构中的函数。这种实现是节省空间的,易于理解,而且似乎是有效的。MFC消息映射和虚函数
我的问题是,为什么核心C++不使用相同的方式,以减少编译器的复杂性和摆脱虚函数表的?也许这个实现也有效率问题?
MFC使用一种有效的方式来处理与虚函数有关的空间消耗和复杂性问题。例如,下面的图像演示了如何获取类层次结构中的函数。这种实现是节省空间的,易于理解,而且似乎是有效的。MFC消息映射和虚函数
我的问题是,为什么核心C++不使用相同的方式,以减少编译器的复杂性和摆脱虚函数表的?也许这个实现也有效率问题?
在每个编译器中,C++多态逻辑或多或少都是相同的;每个对象都有一个vtable(相当于messageEntries
),为了得到实际的函数地址,它被解引用。
C++多态性是更好比MFC,因为它不需要宏或任何其他摆弄;唯一的变化是关键字virtual
,其余代码保持不变。
易用性如何?
// Compare
object_ref._messageEntries[WM_PAINT](); // MFC
// vs.
object_ref.paint(); // C++
关于效率,虚拟方法添加了另一个指针解引用,这在理论上可以避免。在编写性能关键代码时,您希望减少执行操作的数量,并将运行时多态性全部转储。虽然内置的语言解决方案肯定不比MFC慢。
当分派事件时,MFC的解决方案专业人员会显示。在这种情况下,具有可索引函数数组是一个很大的优点,因为它通过组件简化了传递事件。
如果你仔细观察MFC类,你会看到很多虚拟方法。您在上图中看到的是在很多GUI框架中使用的消息驱动机制 - 即使是在android中使用的新机制。
消息驱动通信的主要目的是确保所有GUI相关的东西都在GUI线程上完成。此外,所有消息正在排队,因此它们按照某种顺序进行管理。这实际上与C++的设计或应该如何设计无关。
如果你想看看框架,不使用虚拟方法,然后看看WTL/ATL和CRTP:
http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
你说的*摆脱虚函数表的*是什么意思? MFC策略实现了基于宏的vtable,因为公开基类中的所有消息处理程序会影响整个层次结构,但原则保持不变。 – 2013-03-04 11:38:18