2013-03-04 78 views
0

MFC使用一种有效的方式来处理与虚函数有关的空间消耗和复杂性问题。例如,下面的图像演示了如何获取类层次结构中的函数。这种实现是节省空间的,易于理解,而且似乎是有效的。MFC消息映射和虚函数

MFC Message Map Processing

我的问题是,为什么核心C++不使用相同的方式,以减少编译器的复杂性和摆脱虚函数表的?也许这个实现也有效率问题?

+1

你说的*摆脱虚函数表的*是什么意思? MFC策略实现了基于宏的vtable,因为公开基类中的所有消息处理程序会影响整个层次结构,但原则保持不变。 – 2013-03-04 11:38:18

回答

2

在每个编译器中,C++多态逻辑或多或少都是相同的;每个对象都有一个vtable(相当于messageEntries),为了得到实际的函数地址,它被解引用。

C++多态性是更好比MFC,因为它不需要宏或任何其他摆弄;唯一的变化是关键字virtual,其余代码保持不变。

易用性如何?

// Compare 
object_ref._messageEntries[WM_PAINT](); // MFC 
// vs. 
object_ref.paint(); // C++ 

关于效率,虚拟方法添加了另一个指针解引用,这在理论上可以避免。在编写性能关键代码时,您希望减少执行操作的数量,并将运行时多态性全部转储。虽然内置的语言解决方案肯定不比MFC慢。

当分派事件时,MFC的解决方案专业人员会显示。在这种情况下,具有可索引函数数组是一个很大的优点,因为它通过组件简化了传递事件。

1

如果你仔细观察MFC类,你会看到很多虚拟方法。您在上图中看到的是在很多GUI框架中使用的消息驱动机制 - 即使是在android中使用的新机制。

消息驱动通信的主要目的是确保所有GUI相关的东西都在GUI线程上完成。此外,所有消息正在排队,因此它们按照某种顺序进行管理。这实际上与C++的设计或应该如何设计无关。

如果你想看看框架,不使用虚拟方法,然后看看WTL/ATL和CRTP:

http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern