MFC六大机制(四)运行时类信息机制
一、作用:可以知道一个对象是否属于某一个类
二、使用:
1、必须直接或间接继承CObject类
2、添加声明宏DECLARE_DYNAMIC(CDog)
3、添加实现宏IMPLEMENT_DYNAMIC(CDog, CAnimal)
三、具体实例
1 class CAnimal : public CObject 2 { 3 DECLARE_DYNAMIC(CAnimal) 4 }; 5 IMPLEMENT_DYNAMIC(CAnimal, CObject) 6 7 class CCat : public CAnimal 8 { 9 DECLARE_DYNAMIC(CCat) 10 }; 11 IMPLEMENT_DYNAMIC(CCat, CAnimal) 12 13 class CDog : public CAnimal 14 { 15 //DECLARE_DYNAMIC(CDog) 16 public: 17 static const AFX_DATA CRuntimeClass classCDog; 18 virtual CRuntimeClass* GetRuntimeClass() const; 19 }; 20 //IMPLEMENT_DYNAMIC(CDog, CAnimal) 21 //IMPLEMENT_RUNTIMECLASS(CDog, CAnimal, 0xFFFF, NULL) 22 23 AFX_COMDAT const AFX_DATADEF CRuntimeClass CDog::classCDog = 24 { 25 "CDog", //类名 26 sizeof(class CDog), //类的大小 27 0xFFFF, //类的版本 28 NULL, 29 RUNTIME_CLASS(CAnimal), //获取父类的静态变量地址(用于连接链表) 30 NULL }; 31 32 CRuntimeClass* CDog::GetRuntimeClass() const 33 { 34 //return RUNTIME_CLASS(CDog); 35 return ((CRuntimeClass*)(&CDog::classCDog));//获取本类的静态变量地址 36 } 37 38 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 39 { 40 CDog yellowDog; 41 if (yellowDog.IsKindOf(RUNTIME_CLASS(CObject))) 42 { 43 printf("yellowDog is the object of CObject\n"); 44 } 45 else 46 { 47 printf("yellowDog isn't the object of CObject\n"); 48 } 49 if (yellowDog.IsKindOf(RUNTIME_CLASS(CWnd))) 50 { 51 printf("yellowDog is the object of CWnd\n"); 52 } 53 else 54 { 55 printf("yellowDog isn't the object of CWnd\n"); 56 } 57 return 0; 58 }
四、伪代码
1 //判断yellowDog对象是否属于CObject类 2 yellowDog.IsKindOf(RUNTIME_CLASS(CObject)) 3 { 4 //获取本类的运行时类信息地址 5 CRuntimeClass* pClassThis = GetRuntimeClass(); 6 //判断该对象是否由CObject类而来 7 return pClassThis->IsDerivedFrom(pClass); 8 { 9 const CRuntimeClass* pClassThis = this; 10 //遍历链表 11 while (pClassThis != NULL) 12 { 13 if (pClassThis == pBaseClass) 14 return TRUE; 15 pClassThis = pClassThis->m_pBaseClass; 16 } 17 return FALSE; 18 } 19 }
判断一个对象是否属于某个类的大致过程为:先获取对象对应的类的运行时类信息地址,然后跟指定的类的运行时类信息
地址进行比较,如果相等,则该对象属于指定的类,如果不是,通过运行时类信息的第五个成员,可以遍历链表,直到结
束,还没有匹配上,那么,该对象不属于指定的类。