欢迎来到天天文库
浏览记录
ID:44811738
大小:86.50 KB
页数:15页
时间:2019-10-29
《MFC基础类简介与消息映射》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、MFC基础类简介与消息映射1、CObject类CObject是大多数MFC类的根类或基类。CObject类有很多有用的特性:对运行时类信息的支持,对动态创建的支持,对串行化的支持,对象诊断输出,等等。MFC从CObject派生出许多类,具备其中的一个或者多个特性。程序员也可以从CObject类派生出自己的类,利用CObject类的这些特性。这里将讨论MFC如何设计CObject类的这些特性。首先,考察CObject类的定义,分析其结构和方法(成员变量和成员函数)对CObject特性的支持。然后,讨论CObject特性及其实现机制。1.CObject的结构
2、以下是CObject类的定义:classCObject{public://与动态创建相关的函数virtualCRuntimeClass*GetRuntimeClass()const;析构函数virtual~CObject();//virtualdestructorsarenecessary//与构造函数相关的内存分配函数,可以用于DEBUG下输出诊断信息void*PASCALoperatornew(size_tnSize);void*PASCALoperatornew(size_t,void*p);voidPASCALoperatordelete(voi
3、d*p);#ifdefined(_DEBUG)&&!defined(_AFX_NO_DEBUG_CRT)void*PASCALoperatornew(size_tnSize,LPCSTRlpszFileName,intnLine);#endif//缺省情况下,复制构造函数和赋值构造函数是不可用的//如果程序员通过传值或者赋值来传递对象,将得到一个编译错误protected://缺省构造函数CObject();private://复制构造函数,私有CObject(constCObject&objectSrc);//noimplementation//赋值构
4、造函数,私有voidoperator=(constCObject&objectSrc);//noimplementation//Attributespublic://与运行时类信息、串行化相关的函数BOOLIsSerializable()const;BOOLIsKindOf(constCRuntimeClass*pClass)const;//OverridablesvirtualvoidSerialize(CArchive&ar);//诊断函数virtualvoidAssertValid()const;virtualvoidDump(CDumpConte
5、xt&dc)const;//Implementationpublic://与动态创建对象相关的函数staticconstAFX_DATACRuntimeClassclassCObject;#ifdef_AFXDLLstaticCRuntimeClass*PASCAL_GetBaseClass();#endif};由上可以看出,CObject定义了一个CRuntimeClass类型的静态成员变量:CRuntimeClassclassCObject还定义了几组函数:构造函数析构函数类,诊断函数,与运行时类信息相关的函数,与串行化相关的函数。其中,一个静态函数
6、:_GetBaseClass;五个虚拟函数:析构函数、GetRuntimeClass、Serialize、AssertValid、Dump。这些虚拟函数,在CObject的派生类中应该有更具体的实现。必要的话,派生类实现它们时可能要求先调用基类的实现,例如Serialize和Dump就要求这样。静态成员变量classCObject和相关函数实现了对CObjet特性的支持。1.CObject类的特性下面,对三种特性分别描述,并说明程序员在派生类中支持这些特性的方法。1.对运行时类信息的支持该特性用于在运行时确定一个对象是否属于一特定类(是该类的实例),或者
7、从一个特定类派生来的。CObject提供IsKindOf函数来实现这个功能。从CObject派生的类要具有这样的特性,需要:·定义该类时,在类说明中使用DECLARE_DYNAMIC(CLASSNMAE)宏;·在类的实现文件中使用IMPLEMENT_DYNAMIC(CLASSNAME,BASECLASS)宏。2.对动态创建的支持前面提到了动态创建的概念,就是运行时创建指定类的实例。在MFC中大量使用,如前所述框架窗口对象、视对象,还有文档对象都需要由文档模板类(CDocTemplate)对象来动态的创建。从CObject派生的类要具有动态创建的功能,需要
8、:·定义该类时,在类说明中使用DECLARE_DYNCREATE(CLASSNM
此文档下载收益归作者所有