一、CRuntimeClass背景介绍
MSDN:对于MFC中每个从CObject派生的类来说,都有一个相关的CRuntimeClass结构体,在程序运行时可以访问该结构体来获取对象及其基类的运行时信息。
CRuntimeClass是一个结构体,并且其本身并没有基类。在运行时确定一个对象的类型是很重要的,尤其是在做类型检查时;而C++语言本身并不支持运行时类信息。CObject和CRuntimeClass是MFC中两个非常重要的类/结构,绝大部分MFC类都是以CObject做为基类, CRuntimeClass结构同CObject密不可分,了解它们对于深入理解MFC具有重要意义。
二、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
//如果你的应用程序是静态地链接到MFC的,则是一个指向基类的CRuntimeClass结构的指针。
CRuntimeClass* m_pBaseClass;
//以上m_pBaseClass的指针(函数)是MFC运行时确定类层次的关键,它一个简单的单向链表
#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”作为它的名称),然后通过某种手段将整个类库构建好,“类别型目录表”能呈现类似的风貌
三、
来源:CSDN
作者:淡月明
链接:https://blog.csdn.net/sinat_31608641/article/details/104812915