MFC 使用一种有效的方法来处理与虚拟功能有关的空间消耗和复杂性问题。例如,下图演示了如何获取类层次结构中的函数。这种实现方式节省空间,易于理解,而且似乎也很高效。
我的问题是,为什么核心 C++ 不使用相同的方式来降低编译器的复杂性并摆脱 vtables?也许这个实现也有效率问题?
MFC 使用一种有效的方法来处理与虚拟功能有关的空间消耗和复杂性问题。例如,下图演示了如何获取类层次结构中的函数。这种实现方式节省空间,易于理解,而且似乎也很高效。
我的问题是,为什么核心 C++ 不使用相同的方式来降低编译器的复杂性并摆脱 vtables?也许这个实现也有效率问题?
C++ 多态性在每个编译器中的实现或多或少都是相同的;每个对象都有一个 vtable(等效于messageEntries
),它被取消引用以获得实际的函数地址。
C++ 多态性优于MFC,因为它不需要宏或任何其他摆弄;唯一的变化是virtual
关键字,其余代码保持不变。
易用性如何?
// Compare
object_ref._messageEntries[WM_PAINT](); // MFC
// vs.
object_ref.paint(); // C++
关于效率,虚方法增加了另一个指针解引用,理论上可以避免。在编写性能关键代码时,您希望减少执行操作的数量,将运行时多态性全部丢弃。不过,内置语言解决方案肯定不会比 MFC 慢。
MFC 的解决方案专家在调度事件时显示。在这种情况下,具有可索引函数数组是一大优势,因为它简化了通过组件传递事件。
如果您仔细研究 MFC 类,您会看到许多虚拟方法。您在上图中看到的是在许多 GUI 框架中使用的消息驱动 mechanizm - 即使是在 android 上使用的新框架中也是如此。
消息驱动通信的主要目的是确保所有与 GUI 相关的东西都在 GUI 线程上完成。此外,所有消息都在排队,因此它们按某种顺序进行管理。这实际上与 C++ 的设计或应该如何设计无关。
如果您想查看不使用虚拟方法的框架,请查看 WTL/ATL 和 CRTP:
http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern