为什么MFC生成的类中,一般把constructor声明为protected,descturctor声明为public,消息映射机制中的函数也声明为protected?

解决方案 »

  1.   

    把constructor搞成protected的类,一般都是由application framework(=MFC实现的编程框架)使用动态创建的机制创建其实例(对象),这样可以防止你自己去创建它的实例。把消息处理函数也搞成protected,是因为application framework使用消息映射机制调用这些函数,这样当然也是防止你直接去调用这些函数。
      

  2.   

    但为什么app framework就可以使用protected成员函数呢?这似乎不符合protected的本义。为什么他的析构函数又被声明为public呢?
      

  3.   

    派生类和友元都可以调用 protected member ,MFC 中这些 protected member 大部分是被类的其他函数调用的,比如 constructor 是被 DECLARE_DYNCREATE 宏定义的 static CObject* PASCAL CreateObject(); 函数调用的。destructor 定义为 protected 的话,在其他类和函数中 delete pObject; 就不可能编译通过了。
      

  4.   

    动态创建机制=运行时创建,MFC关键技术之一:
    简单描述一下:
    动态创建声名宏(DECLARE_DYNCREATE)会给类添加一组静态成员和变量(如: static CObject* PASCAL CreateObject();),app framework通过这些东东直接得到这个类的constructor的函数指针,然后通过这个函数指针调用constructor完成动态创建,而不是直接调用被保护的constructor。