运行时识别类笔记

来源:互联网 发布:windows 域名解析 编辑:程序博客网 时间:2024/06/07 05:59

运行时类信息(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

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