Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)qq
published in(发表于) 2014/7/9 22:38:26
visual c++ MFC的CObject类

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 allocations

void* PASCAL operator new(size_t nSize);

void* PASCAL operator new(size_t, void* p);

void PASCAL operator delete(void* p);

#if _MSC_VER >= 1200

void 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 >= 1200

void PASCAL operator delete(void *p, LPCSTR lpszFileName, int nLine);

#endif

#endif

protected:

CObject();

private:

CObject(const CObject& objectSrc); // no implementation

void operator=(const CObject& objectSrc); // no implementation

// Attributes

public:

BOOL IsSerializable() const;

BOOL IsKindOf(const CRuntimeClass* pClass) const;

// Overridables

virtual void Serialize(CArchive& ar);

#if defined(_DEBUG) || defined(_AFXDLL)

// Diagnostic Support

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

// Implementation

public:

static const AFX_DATA CRuntimeClass classCObject;

#ifdef _AFXDLL

static 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添加到类的实现文件中。




If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759