【问题标题】:What happens when BEGIN_MESSAGE_MAP is written as BEGIN_MESSAGE_MAP(Class, GrandParentClass)?当 BEGIN_MESSAGE_MAP 写为 BEGIN_MESSAGE_MAP(Class, GrandParentClass) 时会发生什么?
【发布时间】:2020-09-07 07:43:27
【问题描述】:

我遇到了一段代码,其中一个类的 BEGIN_MESSAGE_MAP 将其祖父类作为第二个参数。我知道当它是父类时,如果子类不处理消息,它会检查父类是否处理。我找不到祖父母类案例的文档。行为是否相似?它会跳过检查父类的消息映射并检查祖父类吗?

【问题讨论】:

    标签: c++ windows mfc


    【解决方案1】:

    BEGIN_MESSAGE_MAP 是一个宏,因此您可以查看扩展代码并了解它的作用。确切的定义可能因版本而异,但或多或​​少:

    #define BEGIN_MESSAGE_MAP(theClass, baseClass) \
        const AFX_MSGMAP* PASCAL theClass::_GetBaseMessageMap() \
            { return &baseClass::messageMap; } \
        const AFX_MSGMAP* theClass::GetMessageMap() const \
            { return &theClass::messageMap; } \
        AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
        { &theClass::_GetBaseMessageMap, &theClass::_messageEntries[0] }; \
        AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
        { \
    

    不太容易阅读...但baseClass 仅用于返回基本地图的非虚拟函数_GetBaseMessageMap。作为回报,它用于构建真正的theClass::messageMap 的第一部分,即指向完整消息映射部分的指针列表(另一部分是此类的映射)。

    TL;DR;是的,对于任何没有在这个类中处理的消息,它都会跳过父类的映射,直接进入祖父类的映射。

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 2013-06-09
      • 2014-03-31
      • 2013-07-30
      • 1970-01-01
      相关资源
      最近更新 更多