MFC六大关键技术之仿真学习笔记(四)

来源:互联网 发布:nginx 多域名配置 编辑:程序博客网 时间:2024/05/21 09:37

     这一节我认为挺简单的,IsKindOf无非就是判断某个对象是否是某种类或者继承于某种类。


*IsKindOf(运行时类型识别)

     因为有了前面的“类型识别”网,我们可以很方便进行“同宗”路线的追踪,当然我们也可以"对类型识别"网进行遍历,得到所有类型。

我们在CObject中加入一个成员函数:

BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const{CRuntimeClass* pClassThis = GetRuntimeClass();while (pClassThis != NULL){if (pClassThis == pClass){return TRUE;}pClassThis = pClassThis->m_pBaseClass;}return FALSE;}

当然所有派生于CObject的类均实现这种方法,依次向基类对比对应的CRuntimeClass。其实我当时在想啊,这个比较为什么不直接对比CRuntimeClass中的m_lpszClassName呢?


MFC在这里的处理很巧妙,我们在DECARE_DYNAMIC中可以看到

static CRuntimeClass class##class_name; 

virtual CRuntimeClass* GetRuntimeClass() const;

GetRuntimeClass() 经过override可返回相对应的class##class_name成员,class##class_name为静态成员,即类对应唯一一个class##class_name,那么我们便可根据class##class_name地址比较来确定是否是某种类型或者继承于某种类型。


0 0