Go homepage(回首页) Upload pictures (上传图片) Write articles (发文字帖)
The author:(作者)qqpublished in(发表于) 2014/7/9 22:38:26 visual c++ MFC的CObject类
visual c++ MFC的CObject类MFC的CObject类是抽象类最原始的一个例子。它没有任何祖先,因此可以从它出发直接创建该类的对象。CObject的原型如下: class AFX_NOVTABLE CObject#endif{public:// Object model (types, destruction, allocation)virtual CRuntimeClass* GetRuntimeClass() const;virtual ~CObject(); // virtual destructors are necessary// Diagnostic allocationsvoid* PASCAL operator new(size_t nSize);void* PASCAL operator new(size_t, void* p);void PASCAL operator delete(void* p);#if _MSC_VER >= 1200void PASCAL operator delete(void* p, void* pPlace);#endif#if defined(_DEBUG) && !defined(_AFX_NO_DEBUG_CRT)void* PASCAL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);#if _MSC_VER >= 1200void PASCAL operator delete(void *p, LPCSTR lpszFileName, int nLine);#endif#endifprotected:CObject();private:CObject(const CObject& objectSrc); // no implementationvoid operator=(const CObject& objectSrc); // no implementation// Attributespublic:BOOL IsSerializable() const;BOOL IsKindOf(const CRuntimeClass* pClass) const;// Overridablesvirtual void Serialize(CArchive& ar);#if defined(_DEBUG) || defined(_AFXDLL)// Diagnostic Supportvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endif// Implementationpublic:static const AFX_DATA CRuntimeClass classCObject;#ifdef _AFXDLLstatic CRuntimeClass* PASCAL _GetBaseClass();#endif};从原型中可以看出,CObject类为程序员提供了对象诊断、运行时类型标识和序列化等功能。读者可以看到,构造函数的属性是protected,也就是说必须从一个派生类来对它进行初始化。派生类只继承了4个成员函数(除了操作运算符重载)和一个运行类对象。它不支持多重继承,派生类不能有多于一个的CObject类。通常在使用MFC编程中并不会直接使用CObject类,除非读者想要从它出发进行类继承。往往实际编程中使用和继承它的子孙类来创建和操作对象。CObject类的功能如下:(1)对象诊断:MFC提供了两种对象诊断特性,一种是利用成员函数AssertValid进行对象有效性检查,这样可以使类在继续运行以前对自己进行正确性检查。另一种是利用成员函数Dump输出对象的数据成员的值,诊断信息以文本形式放入一个数据流中,用于调试器的输出窗口信息显示。这两种诊断只能用于Debug版的应用程序。(2)CObject类提供了GetRuntimeClass和IsKindOf两个成员函数来支持运行时类型识别。函数GetRunTimeClass根据对象的类返回一个相关联的指向CRuntimeClass结构的指针,它包含了一个类的运行信息;函数IsKindOf用于测试对象与给定类的关系。(3)序列化是指对象将其状态保存在一个字节流中,并用该字节流重建对象。通过与CArchive相结合,CObject类为其派生类提供了序列化功能。若要创建一个支持序列化的派生类,必须将DECLARE_SERIAL宏添加到类定义中,将IMPLEMENT_SERIAL添加到类的实现文件中。
赞