概述
RTCI(runtime class information)是CObject对象提供的一个功能,它能判断一个类是否是从某个类派生而来。
使用RTCI需要满足两个条件:
1、 从CObject派生
2、 在类声明中添加DECLARE_DYNAMIC宏,在实现文件中添加IMPLEMENT_DYNAMIC宏。
示例:
用法:
解析:
IsKindOf是CObject中的成员函数,任何从CObject派生而来的类都可以使用它,用来确定是否从特定的类派生而来。
RUNTIME_CLASS这个宏将类名称转换为了CRuntimeClass*,它是如何做到的呢?静态库版本定义如下:
RUNTIME_CLASS(CParent)展开就是:((CRuntimeClass*)(&CParent::classCParent))
可以看出,classCParent是CParent的成员变量。那它是怎么来的呢?它是DECLARE_DYNAMIC这个宏引入到类中的。
DECLARE_DYNAMIC宏定义如下:
DECLARE_DYNAMIC宏在类中引入了一个静态常成员变量和一个用于获取当前类对象CRuntimeClass指针的虚函数。将DECLARE_DYNAMIC(CParent)展开,即为:
GetRuntimeClass被定义为虚函数,因为如果被定义为普通成员函数,当以一个指向派生类对象的父类指针调用GetRuntimeClass时,获得的将是对应父类的CRuntimeClass指针。这也是覆盖与多态的区别所在。
在类中添加的声明,对应的在实现文件中就应该有实现,IMPLEMENT_DYNAMIC宏用来完成这件事。它初始化了类的静态常变量,并且定义了GetRuntimeClass函数。宏定义如下:
CRuntimeClass结构如下:
在CRuntimeClass中有7个成员变量,还有一些成员函数。RTCI只使用了CRuntimeClass中的三个成员变量:m_lpszClassName、m_nObjectSize、m_pBaseClass,也用到了IsDerivedFrom函数。
IsDerivedFrom通过向上遍历继承树,来判断对象是否是从某个类派生而来。
最后
以上就是欣喜玫瑰为你收集整理的MFC运行时类型信息(RTCI)的全部内容,希望文章能够帮你解决MFC运行时类型信息(RTCI)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复