一、CRuntimeClass介绍
CRuntimeClass
是一个在MFC框架中使用的类,用于管理和存储有关类类型的信息,特别是用于支持运行时类型信息(RTTI)和对象的动态创建。这个类在MFC中被广泛用于处理对象的类型信息。
主要用途和特点包括:
-
运行时类型信息(RTTI):
CRuntimeClass
允许在运行时确定对象的实际类型。你可以使用CRuntimeClass
对象来比较和识别对象的类型。 -
对象的动态创建: 通过
CRuntimeClass
对象,你可以在运行时动态创建对象,而不需要在编译时明确知道对象的类型。这对于实现插件系统或者需要动态对象创建的场景非常有用。 -
存储类类型信息: 每个派生自
CObject
的MFC类通常都包含一个静态成员变量,它是一个指向相应CRuntimeClass
对象的指针。这个指针用于存储和访问类的类型信息。
二、CRuntimeClass 的结构
CRuntimeClass是一个结构体,它的定义如下:
struct CRuntimeClass
{
// Attributes
//类名,一般是指包含CRuntimeClass对象的类的名称
LPCSTR m_lpszClassName;
//包含CRuntimeClass对象的类sizeof的大小,不包括它分配的内存
int m_nObjectSize;
// schema number of the loaded class分类编号(对不可分类的类,该值为-1)
UINT m_wSchema;
// NULL => abstract class 指向一个建立实例的构造函数,创建一个类的对象,抽象类则返回NULL(只有//在类支持动态创建时才有效;否则,返回NULL)。PASCAL不用管,是个过时了的calling convension。
CObject* (PASCAL* m_pfnCreateObject)();
//mfc用于动态对象创建的CRuntimeClass结构的一个成员变量
CObject*(*m_pfnCreateObject)();
#ifdef _AFXDLL
//是一个指向函数的指针,该函数返回基类的CRuntimeClass结构。
CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
#else
//m_pBaseClass的指针(函数)是MFC运行时确定类层次的关键,它一个简单的单向链表
CRuntimeClass* m_pBaseClass;
#endif
// Operations
/*
这个函数给予CObject 派生类运行时动态建立的能力
从CObject派生的类可以支持动态创建,这是在运行时创建一个指定类的对象的能力。例如,文档,视和框架类就应该支持动态创建。CreateObject成员函数可以用来实现这个功能,在运行时为这些类创建对象。
*/
CObject* CreateObject();
/*
这个函数使用 m_pBaseClass或 m_pfnGetBaseClass遍历整个类层次确定是否pBaseClass指向的类是基类,使用它可以判断某类是否是从pBaseClass指向的类在派生来。
*/
BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const; //判断是不是一个基类的子类
// Implementation
void Store(CArchive& ar) const;
static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);
//单向链表,每个类的CRuntimeClass结构体对象的 m_pNextClass 都指向其直接基类的CRuntimeClass结构体对象
CRuntimeClass* m_pNextClass; // linked list of registered classes
};
UML图如下所示
每一个类拥有这样一个CRuntimeClass成员变量,并且有一定的命名规则(例如在类名称之前冠以“class”作为它的名称),然后通过某种手段将整个类库构建好,“类别型录网”能呈现类似的风貌
三、实例
class CMyObject : public CObject
{
DECLARE_DYNAMIC(CMyObject)
public:
CMyObject(); // 构造函数
// 其他成员函数和属性
};
IMPLEMENT_DYNAMIC(CMyObject, CObject)
在上述示例中,DECLARE_DYNAMIC
宏和 IMPLEMENT_DYNAMIC
宏用于为 CMyObject
类启用RTTI支持,并将类的类型信息注册到 CRuntimeClass
中。
然后,你可以使用以下方法来利用 CRuntimeClass
:
GetRuntimeClass()
:获取对象的CRuntimeClass
对象,允许你比较对象的类型。CreateObject()
:根据类的类型信息动态创建对象的实例。
总之,CRuntimeClass
在MFC中用于支持对象的RTTI和动态创建,使得在运行时能够更灵活地处理对象类型和创建对象实例。
参考:
https://www.cnblogs.com/liqilei/archive/2010/09/18/1830381.html