C++ MFC消息映射和虚拟函数

C++ MFC消息映射和虚拟函数,c++,mfc,virtual-functions,C++,Mfc,Virtual Functions,MFC使用一种有效的方法来处理虚拟函数涉及的空间消耗和复杂性问题。例如,下图演示了如何获取类层次结构中的函数。这种实现节省空间,易于理解,而且似乎效率很高 我的问题是,为什么核心C++不使用同样的方法来减少编译器的复杂性,并摆脱VTABLE?也许这种实现也存在效率问题?C++polymorhphism在每个编译器中的实现或多或少是相同的;每个对象都有一个vtable(相当于messageEntries),该vtable被解引用以获取实际的函数地址 C++多态性比MFC好,因为它不需要宏或任何其

MFC使用一种有效的方法来处理虚拟函数涉及的空间消耗和复杂性问题。例如,下图演示了如何获取类层次结构中的函数。这种实现节省空间,易于理解,而且似乎效率很高


我的问题是,为什么核心C++不使用同样的方法来减少编译器的复杂性,并摆脱VTABLE?也许这种实现也存在效率问题?

C++polymorhphism在每个编译器中的实现或多或少是相同的;每个对象都有一个vtable(相当于
messageEntries
),该vtable被解引用以获取实际的函数地址

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

那么易用性呢

// Compare
object_ref._messageEntries[WM_PAINT](); // MFC
// vs.
object_ref.paint(); // C++
关于效率,虚拟方法增加了另一个指针解引用,这在理论上是可以避免的。在编写性能关键代码时,您希望减少执行的操作数,同时转储运行时多态性。不过,内置语言解决方案肯定不会比MFC慢


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

C++polymorhphism在每个编译器中的实现或多或少是相同的;每个对象都有一个vtable(相当于
messageEntries
),该vtable被解引用以获取实际的函数地址

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:


如果仔细观察MFC类,您将看到许多虚拟方法。在上图中,您可以看到许多GUI框架中使用的消息驱动机制,甚至在android上使用的新框架中也是如此

消息驱动通信的主要目的是确保所有GUI相关的工作都在GUI线程上完成。此外,所有消息都在排队,因此它们是按一定顺序管理的。这与C++的设计和设计无关。 如果您想查看不使用虚拟方法的框架,请查看WTL/ATL和CRTP:

您所说的删除vtables是什么意思?MFC策略实现了基于宏的vtables,因为公开基类中的所有消息处理程序会影响整个层次结构,但原理保持不变。你说去掉vtables是什么意思?MFC策略实现基于宏的vtables,因为公开基类中的所有消息处理程序将影响整个层次结构,但原理保持不变。