Go homepage(回首页) Upload pictures (上传图片) Write articles (发文字帖)
The author:(作者)qqpublished in(发表于) 2014/7/9 22:38:31 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.hclass 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的对象");elseAfxMessageBox("这不是一个CNewClass的对象");delete pObj;}
赞