MFC六大关键技术之仿真学习笔记(四)
2015-06-06 18:08
411 查看
这一节我认为挺简单的,IsKindOf无非就是判断某个对象是否是某种类或者继承于某种类。
*IsKindOf(运行时类型识别)
因为有了前面的“类型识别”网,我们可以很方便进行“同宗”路线的追踪,当然我们也可以"对类型识别"网进行遍历,得到所有类型。
我们在CObject中加入一个成员函数:
当然所有派生于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地址比较来确定是否是某种类型或者继承于某种类型。
*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地址比较来确定是否是某种类型或者继承于某种类型。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++中拷贝构造函数的应用详解
- C++中引用(&)的用法与应用实例分析
- C++使用CriticalSection实现线程同步实例
- Visual C++中MFC消息的分类
- C++智能指针实例详解