《RTTI运行时类型识别课件》由会员分享,可在线阅读,更多相关《RTTI运行时类型识别课件(20页珍藏版)》请在金锄头文库上搜索。
1、2020/8/17,RTTI运行时类型识别,2020/8/17,实例:Shape,2020/8/17,Shape代码调试,2020/8/17,运行时类型识别(RTTI),Runtime Type Information 如何在程序执行过程中知道某个对象是属于哪一种类(class)?,2020/8/17,运行时类型识别(RTTI),Runtime Type Information 如何在程序执行过程中知道某个对象是属于哪一种类(class)? MFC的RTTI能力涉及到: 宏:DECLARE_DYNAMIC 宏:IMPLEMENT_DYNAMIC 类:CRuntimeClass,2020/8/1
2、7,运行时类型识别(RTTI),Runtime Type Information 如何在程序执行过程中知道某个对象是属于哪一种类(class)? MFC的RTTI能力涉及到: 宏:DECLARE_DYNAMIC 宏:IMPLEMENT_DYNAMIC 类:CRuntimeClass,我们的目标:仿真出一个RTTI的DOS版本,2020/8/17,IsKindOf,目标:程序在执行期间能够侦测某个对象是否“属于某种类”,传回TRUE或FALSE。,2020/8/17,IsKindOf,以Shape为例,我们的目标: CSquare* pSquare = new CSquare; cout IsK
3、indOf(CSquare);/ TRUE cout IsKindOf(CRect);/ TRUE cout IsKindOf(CShape);/ TRUE cout IsKindOf(CCircle);/ FALSE 以MFC的类层次来说,目标: CMyDoc* pMyDoc = new CMyDoc; cout IsKindOf(CMyDoc);/ TRUE cout IsKindOf(CDocument);/ TRUE cout IsKindOf(CCmdTarget);/ TRUE cout IsKindOf(CWnd);/ FALSE,2020/8/17,IsKindOf,以Shap
4、e为例,我们的目标: CSquare* pSquare = new CSquare; cout IsKindOf(CSquare);/ TRUE cout IsKindOf(CRect);/ TRUE cout IsKindOf(CShape);/ TRUE cout IsKindOf(CCircle);/ FALSE 以MFC的类层次来说,目标: CMyDoc* pMyDoc = new CMyDoc; cout IsKindOf(CMyDoc);/ TRUE cout IsKindOf(CDocument);/ TRUE cout IsKindOf(CCmdTarget);/ TRUE c
5、out IsKindOf(CWnd);/ FALSE,注意:真正的IsKindOf参数其实没有那么单纯,2020/8/17,设计RTTI,一种颜色,想知道RGB成分比,查色表 一种产品,想知道型号,查说明书,2020/8/17,设计RTTI,一种颜色,想知道RGB成分比,查色表 一种产品,想知道型号,查说明书 RTTI:在类建构起来的时候,记录必要的信息,以建立型录。 型录中的类信息,以链表方式连接起来,将来方便一一比较。 “类别型录”的链表元素: CRuntimeClass(结构),2020/8/17,CRuntimeClass,CRuntimeClass包含的内容: 类名称 Next指针
6、First指针(全局变量,static) 其它内容,2020/8/17,CRuntimeClass对象内容,2020/8/17,类别型录表,我们希望:每一个类都能拥有这样一个CRuntimeClass成员变量,当经由某种手段将整个类库建构好之后,“类别型录”能呈现这样的风貌:,2020/8/17,类别型录表,2020/8/17,DECLARE_DYNAMIC,#define DECLARE_DYNAMIC(class_name) public: static CRuntimeClass class#class_name; virtual CRuntimeClass* GetRuntimeCla
7、ss() const;,2020/8/17,IMPLEMENT_DYNAMIC,#define IMPLEMENT_DYNAMIC(class_name, base_class_name) _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0 xFFFF, NULL),2020/8/17,DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC,/ *.h class CView : public CWnd DECLARE_DYNAMIC(CView) ; / *.cpp IMPLEMENT_DYNAMIC(CView, CWn
8、d),2020/8/17,DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC,/ *.h class CView : public CWnd public: static CRuntimeClass classCView; virtual CRuntimeClass* GetRuntimeClass() const; ; / *.cpp static char _lpszCView = “CView”; CRuntimeClass CView:classCView = _lpszCView, sizeof(CView), 0 xFFFF, NULL, ,2020/8/17,DECLARE_DYNAMIC(Cxxx)IMPLEMENT_DYNAMIC(Cxxx, Cxxxbase),