这可能是MFC设计的小缺陷.解决思路

这可能是MFC设计的小缺陷...
///////////////////////////////////////////////////////////
#define   DECLARE_MESSAGE_MAP()   \
                static   AFX_MSGMAP_ENTRY   _messageEntries[];   \
                static   AFX_MSGMAP   messageMap;   \
                virtual   AFX_MSGMAP*   GetMessageMap()   const;
//////////////////////////////////////////////////////////

上面是宏DECLARE_MESSAGE_MAP的定义,关于它的定义有一点我不太明白,请大家指教:

我的问题是:函数GetMessageMap()为什么要设置成虚的?

我是这样子想的:

如果我们想让一个类有能力处理消息,那么我们在声明类的时候一是要将其基类设置为CCmdTarget或其派生类,第二就是在类体中加入此宏,以便把类添加到消息映射表中.
既然每一个想要处理消息的类都有此宏的加入,那么,扩展成代码之后,每一个能处理消息的类都会有GetMessageMap函数,且此函数的函数体也已成固定的形式,这样子的话是不是就没有必然在此宏中将函数GetMessageMap定义成虚的?定义成虚函数的目的是方便派生类改写之,而这里每一个能处理消息的类及其派生类都会有此函数的加盟,且需要想同的函数体,所以不用改写.

基于此点,我觉得可以将virtual去掉.

(提问的过程中我怀疑是否基类与子类不能有同名非虚函数,不过我实验之后发现我的怀疑是多此一举,我试验的代码:

#include   <iostream.h>

class   A
{
public:
func()
{
cout < < "A::func() " < <endl;
}
};

class   B   :   public   A
{
public:
func()
{
cout < < "B::func() " < <endl;
}
};

void   main()
{
A   a;
B   b;

a.func();
b.func();
((A)b).func();
}

)


此问题只作讨论,小弟最后在学习MFC,刚到消息映射和命令传递这块,遇到这个小小的疑问,还请各位有兴趣的大侠们与以指教.


------解决方案--------------------
因为这些类还要被集成,还要有消息截取,这里不虚==断了后面的路
------解决方案--------------------
你知道虚函数和非虚同名函数的区别吗?知道函数重载、函数多态和函数覆盖的区别吗?
------解决方案--------------------

高质量c++c编程指南
------解决方案--------------------
如果不设置成虚函数,字类怎么处理它所编写的处理函数呢
------解决方案--------------------
建议你看一下:Effective C++和More Effective C++两本书。