运行时识别类笔记

运行时类信息(CRuntimeClass类)

    在程序运行的过程中,可以动态的识别对象是否属于特定的类的技术叫做动态类型识别(Runtime Type Information)。当函数需要识别特定的参数类型的时候,或者是必须针对某个对象执行特殊代码的时候,动态类型识别就非常有用了。

动态类型识别和动态创建

CRuntimeClass的类结构:

    CRuntimeClass中包含了类的名字,类的Size,以及识别类的版本号。如果每个类都写一个创建该类的全局函数的话,就能够依靠从文件或用户输入中取得此函数的内存地址,从而创建用户动态指定的类,这项技术就是动态创建运行时创建指定类的对象。

CObject *(__stdcall* m_pfnCreateObjcet)(); //创建类的函数的指针

CObjcet* CreateObjcet();

为了翻遍调用m_pfnCreateObjcet指向的函数,再编写CreateObject成员函数。

CObjcet* CRuntimeClass::CreateObject()

    要想判断一个类是不是可以从另一个类继承的,可以在CRuntimeClass* m_pBaseClass中可以看到父类的 CRuntimeClass的地址。

   

 

    要想使所有的类都具备运行期识别和动态创建的特性,必须有一个类作为继承体系的顶层(最顶层的父类)——CObject,这个类不但能使 IsDerivedFrom能够顺利执行,还要求提供一个接口辨别对象是否属于特点类IsKindOf(),定义如下:

 

另外还有一个宏定义:

作用是:用来取得 class_name类中CRuntimeClass结构的地址。

RUNTIME_CLASS的是为了方便访问类的CRuntimeClass结构而定义的宏。这里可以看到每个类中CRuntimeClass成员变量的命名规则:在类名之前冠以class作为它的名字。(??)Class##class_name中的##告诉编译器,把两个字符串捆在一起。

 

等价语句:

想要给一个类添加运行期识别的能力,只要继承CObject类就可以了。然后再类中添加CRuntimeClass的静态成员的信息 就可以,像这样的:

下面是静态成员的初始化:

然后在需要识别的地方添加相应的代码即可:

 

重载函数GetRuntimeClass();函数调用的时候也是调用CPersonGetRuntimeClass()。如果想要使CPerson类也支持动态创建,需要为CPerson类再增加一个静态成员函数, 此成员就负责创建CPerson对象

 

    为了将CreateObject函数传递给classCPerson对象中的m_pfnCreateObjcet成员,需要修改初始化的代码,如下:

更方便的东东:

支持类的运行期识别能力的代码是固定的,因此使用宏会更加方便

具体内容如下所示:

 

具备了两个条件:一个是可以CRuntimeClass类型的静态变量,另外一个就是识别时用的虚函数GetRuntimeClass

 

下面的宏来替代初始化代码和实现GetRuntimeClass函数的代码:

IMPLEMENT_RUNTIMECLASS

IMPLEMENT_DYNAMIC

有了这两宏,前面的代码就可以简化成这样的了,非常简单:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值