关闭

MFC运行时类型信息(RTCI)

7716人阅读 评论(0) 收藏 举报

 

RTCI(runtime class information)CObject对象提供的一个功能,它能判断一个类是否是从某个类派生而来。

 

       使用RTCI需要满足两个条件:

1、  CObject派生

2、  在类声明中添加DECLARE_DYNAMIC宏,在实现文件中添加IMPLEMENT_DYNAMIC宏。

 

 


 

示例:

 

 用法:

 

 


解析:

IsKindOfCObject中的成员函数,任何从CObject派生而来的类都可以使用它,用来确定是否从特定的类派生而来。

  

RUNTIME_CLASS这个宏将类名称转换为了CRuntimeClass*,它是如何做到的呢?静态库版本定义如下:

RUNTIME_CLASS(CParent)展开就是:((CRuntimeClass*)(&CParent::classCParent))

可以看出,classCParentCParent的成员变量。那它是怎么来的呢?它是DECLARE_DYNAMIC这个宏引入到类中的。

 

DECLARE_DYNAMIC宏定义如下:

DECLARE_DYNAMIC宏在类中引入了一个静态常成员变量和一个用于获取当前类对象CRuntimeClass指针的虚函数。将DECLARE_DYNAMIC(CParent)展开,即为:

  

GetRuntimeClass被定义为虚函数,因为如果被定义为普通成员函数,当以一个指向派生类对象的父类指针调用GetRuntimeClass时,获得的将是对应父类的CRuntimeClass指针。这也是覆盖与多态的区别所在。

 

在类中添加的声明,对应的在实现文件中就应该有实现,IMPLEMENT_DYNAMIC宏用来完成这件事。它初始化了类的静态常变量,并且定义了GetRuntimeClass函数。宏定义如下:

 

CRuntimeClass结构如下:

 

CRuntimeClass中有7个成员变量,还有一些成员函数。RTCI只使用了CRuntimeClass中的三个成员变量:m_lpszClassNamem_nObjectSizem_pBaseClass,也用到了IsDerivedFrom函数。

 

IsDerivedFrom通过向上遍历继承树,来判断对象是否是从某个类派生而来。

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:135478次
    • 积分:2091
    • 等级:
    • 排名:第18258名
    • 原创:75篇
    • 转载:3篇
    • 译文:2篇
    • 评论:6条
    文章分类
    最新评论