MFC的CRuntimeClass分析

帅比萌擦擦* 提交于 2020-03-12 12:42:47

一、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”作为它的名称),然后通过某种手段将整个类库构建好,“类别型目录表”能呈现类似的风貌

三、

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!