CObject里有什么?

来源:互联网 发布:淘宝领取红包 编辑:程序博客网 时间:2024/04/26 19:57

CObject在afx.h文件中定义,这个头文件在使用MFC向导编程是都会自动包括。

1、CObject类的内容

CObject类定义中包含的函数如下表所示:

函数名称解释

CObject()

1、默认构造函数
2、当一个继承自CObject类需要序列化支持时(即要使用DECALRE_SERIAL),必须有一个默认的构造函数CObject( const CObject& objectSrc )1、复制构造函数delete1、这是一个操作符重载函数
2、有三种不同的参数列表形式,用于删除对象,以防止内存泄漏

new

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)
{
   CObject::Serialize(ar);
   if(ar.IsStoring())   //用CArchive类的IsStoring或IsLoading判断是输入或是输出
      ar << m_years; //CArchive类没有基类,可以使用<<和>>
   else
      ar >> m_years;
}

GetRuntimeClass ()

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类继承了一个类,你将可以获得由它提供的序列化, 运行时类信息, 诊断信息输出的功能支持。对各个特性的支持需要在头文件中使用DECLARE_宏声明,并在相应的CPP文件中使用IMPLEMENT_宏进行定义。三个特性是渐次包括的,不是独立的。下表列出了继承自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

原创粉丝点击