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 }

判断一个对象是否属于某个类的大致过程为:先获取对象对应的类的运行时类信息地址,然后跟指定的类的运行时类信息

地址进行比较,如果相等,则该对象属于指定的类,如果不是,通过运行时类信息的第五个成员,可以遍历链表,直到结

束,还没有匹配上,那么,该对象不属于指定的类。

posted @ 2014-01-08 01:12  the beginner of C++  阅读(557)  评论(0编辑  收藏  举报