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 }
判断一个对象是否属于某个类的大致过程为:先获取对象对应的类的运行时类信息地址,然后跟指定的类的运行时类信息
地址进行比较,如果相等,则该对象属于指定的类,如果不是,通过运行时类信息的第五个成员,可以遍历链表,直到结
束,还没有匹配上,那么,该对象不属于指定的类。


浙公网安备 33010602011771号