MFC的CRuntimeClass分析

一、CRuntimeClass介绍

CRuntimeClass 是一个在MFC框架中使用的类,用于管理和存储有关类类型的信息,特别是用于支持运行时类型信息(RTTI)和对象的动态创建。这个类在MFC中被广泛用于处理对象的类型信息。

主要用途和特点包括:

  1. 运行时类型信息(RTTI): CRuntimeClass 允许在运行时确定对象的实际类型。你可以使用 CRuntimeClass 对象来比较和识别对象的类型。

  2. 对象的动态创建: 通过 CRuntimeClass 对象,你可以在运行时动态创建对象,而不需要在编译时明确知道对象的类型。这对于实现插件系统或者需要动态对象创建的场景非常有用。

  3. 存储类类型信息: 每个派生自 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

CRuntimeClass的结构与功能_渔村居士的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值