CObject是大多數MFC類的根類或基類。CObject類有很多有用的特性:對運行時類信息的支持,對動態創建的支持,對串行化的支持,對象診斷輸出,等等。MFC從CObject派生出許多類,具備其中的一個或者多個特性。程序員也可以從CObject類派生出自己的類,利用CObject類的這些特性。
本章將討論MFC如何設計CObject類的這些特性。首先,考察CObject類的定義,分析其結構和方法(成員變量和成員函數)對CObject特性的支持。然後,討論CObject特性及其實現機制。
CObject的結構
以下是CObject類的定義:
class CObject
{
public:
//與動態創建相關的函數
virtual CRuntimeClass* GetRuntimeClass() const;
析構函數
virtual ~CObject(); // virtual destructors are necessary
//與構造函數相關的內存分配函數,可以用於DEBUG下輸出診斷信息
void* PASCAL operator new(size_t nSize);
void* PASCAL operator new(size_t, void* p);
void PASCAL operator delete(void* p);
#if defined(_DEBUG) && !defined(_AFX_NO_DEBUG_CRT)
void* PASCAL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
#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);
// 診斷函數
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
// Implementation
public:
//與動態創建對象相關的函數
static const AFX_DATA CRuntimeClass classCObject;
#ifdef _AFXDLL
static CRuntimeClass* PASCAL _GetBaseClass();
#endif
};
由上可以看出,CObject定義了一個CRuntimeClass類型的靜態成員變量:
CRuntimeClass classCObject
還定義了幾組函數:
構造函數析構函數類,
診斷函數,