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

The author:(作者)qq
published in(发表于) 2014/7/9 22:38:31
visual c++ MFC运行时类型识别宏

visual c++ MFC运行时类型识别宏

visual c++ MFC运行时类型识别宏

运行时类型识别(Run Time Type Information,RTTI)是指在程序运行时允许确定对象的类型。MFC扩充了一般C++中运行时类型识别的功能,当一个类支持MFC的运行时类型识别时,它允许程序获取对象的信息和基为信息。

1.RUNTIME_CLASS(class_name)宏

RUNTIME_CLASS宏的原型如下:

#define RUNTIME_CLASS(class_name)

((CRuntimeClass*)(&class_name::class##class_name))

RUNTIME_CLASS宏返回参数class_name所指定类的静态成员变量class##class_name的指针,这个指向一个CRuntimeClass结构。

RUNTIME_CLASS宏使程序能实时创建类的实例。为了让这个宏起作用,定义的类必须从类CObject派生而来,并且在派生类的定义中必须使用宏DECLARE_DYNAMIC、DECLARE_DYNCREATE或DECLARE_SERIAL,在派生类的实现文件中必须使用宏IMPLEMENT_DYNAMIC、IMPLEMENT_DYNCREATE或IMPLEMENT_SERIAL。这3个宏使MFC类及其派生类具有3个不同级的功能。

2.动态支持宏

动态支持宏DECLARE_DYNAMIC(class_name)和IMPLEMENT_DYNAMIC(class_name,base_class_name)能够使CObject派生类的对象具有基本的类型识别机能,可以通过调用成员函数CObject::IsKindOf(ClassName)测试对象与给定类ClassName的关系。

DECLARE_DYNAMIC与IMPLEMENT_DYNAMIC的定义如下:

#define _DECLARE_DYNAMIC(class_name)

public:

static AFX_DATA CRuntimeClass class##class_name;

virtual CRuntimeClass* GetRuntimeClass() const;

3.动态创建宏

动态创建宏DECLARE_DYNCREATE(class_name)和IMPLEMENT_DYNCREATE(class_name,base_class_name)是动态支持的一个超集,除了基本的类型识别机能,使用动态创建宏能够使CObject的派生类具有在运行时动态创建对象的功能。注意,支持动态创建的类还必须有一个默认的不带参数的构造函数,用于创建一个稳定的对象。应用程序框架利用这个机能动态创建新的对象,例如当序列化其间从磁盘读取一个对象时,应用程序框架将利用文档类、视图类和框架类的动态创建功能来动态创建它们的运行时对象。

4.序列化宏

序列化宏DECLARE_SERIAL()和IMPLEMENT_SERIAL()是动态支持和动态创建的一个超集,除了基本的类型识别能力和动态创建能力,使用序列化宏能够使从CObject派生而来的类具有序列化功能。

5.应用

请看下面的例子:从CObject派生出一个新类CNewClass,并使用RUNTIME_CLASS宏的基本对象判断能力。

//声明

//NewClass.h

class CNewClass:public Cojbect

{

DECLARE_DYNAMIC(CNewClass)

Public:

void NewFunction();

};

//实现

//NewClass.cpp

#include "NewClass.h"

IMPLEMENT_DYNAMIC(CNewClass,CObject)

void CNewClass::NewFunction()

{

CObject* pObj=new CNewClass;

if(pObj->IsKindOf(RUNTIME_CLASS(CNewClass)))

AfxMessageBox("这是一个CNewClass的对象");

else

AfxMessageBox("这不是一个CNewClass的对象");

delete pObj;

}




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





QQ:154298438
QQ:417480759