CObject在afx.h文件中定义,这个头文件在使用MFC向导编程是都会自动包括。
1、CObject类的内容
CObject类定义中包含的函数如下表所示:
函数名称 | 解释 |
CObject() | 1、默认构造函数 2、当一个继承自CObject类需要序列化支持时(即要使用DECALRE_SERIAL),必须有一个默认的构造函数 |
CObject( const CObject& objectSrc ) | 1、复制构造函数 |
delete | 1、这是一个操作符重载函数 2、有三种不同的参数列表形式,用于删除对象,以防止内存泄漏 |
1、这是一个操作符重载函数 2、有三个不同的参数列表形式 3、在发布版本中其功能与malloc是相似的 4、在DEBUG版本中,使用#define new DEBUG_NEW将会对内存错误的报告多出一些内容 | |
AssertValid () const | 1、这是一个常函数 2、用于对一个对象(的类)做有效性检查 |
Dump () const | 1、这是一个常函数 2、用于向CDumpContext类(这个类没有基类,这个类的对象可以使用<<输出信息,)对象输出信息 |
IsSerializable () const | 1、这是一个常函数 2、用于测试这个对象(类)是否可以序列化 |
Serialize (CArchive& ar) | 1、用于序列化一个类 2、例子: void CAge::Serialize(CArchive& ar) |
1、用于返回一个CRuntimeClass结构类型的指针 | |
IsKindOf (const CRuntimeClass* pClass) const | 1、这是一个常函数 2、用于测试当前对象与给定类间的关系:是否是这个类的对象 |
2、CObject派生类的内容
当由CObject派生一个类是,你只是继承了四个虚函数和一个CRuntimeClass结构。
每个继承自CObject类的类都会有个CRuntimeClass结构与其相关,这个结构可以用于在运行时获取一个对象的类类型和基类类型。CRuntimeClass是个结构,不是任何类的派生。
CRuntimeClass结构最重要的应用就是与ASSERT函数一同使用来确定一个类/对象的类型:
//RUNTIME_CLASS是个宏,用于生成一个 指定类型(这个类必须是由CObject直/间接派生的)的CRuntimeClass结构指针
CRuntimeClass* pRuntimeClass = RUNTIME_CLASS( CMyClass );
CObject* pObject = pRuntimeClass->CreateObject();//IsKindOf可以验证一个类是否是调用IsKindOf的类的派生类或同类型
ASSERT( pObject->IsKindOf( RUNTIME_CLASS( CMyClass ) ) );
3、 CObject的派生类如何拥有动态类型信息、动态创建及序列化特性
使用宏 | CObject::IsKindOf (动态类型信息识别) | CRuntimeClass:: CreateObject (动态创建类) | CArchive::operator>> CArchive::operator<< (序列化,将类写入可保存的文件) |
---|---|---|---|
无 | No | No | No |
DECLARE_DYNAMIC | Yes | No | No |
DECLARE_DYNCREATE | Yes | Yes | No |
DECLARE_SERIAL | Yes | Yes | Yes |