2007-6-24 14:57
所谓运行时的类型识别就是指对象能够动态(动态这个词是相对于静态而言的,就是指在程序运行的阶段,不光是在编译的阶段)地知道自己、自己的老爹、自己的爷爷到自己的老祖宗是谁,也就是能够通过一个叫IsKindOf()的成员函数知道一个类是不是它自己或者它的祖宗。
要实现这个功能,MFC在每个类的定义中中加入了一个静态的CRuntimeClass的结构体,并将所有的类的这个结构体连成一个链表,每个新加入的类的CRuntimeClass作为表头,这个结构体的成员变量记录了它自己的名字,并指向它的老爹,还指向链表中下一个节点。
在每个类的CRuntimeClass结构体中有两个指针,一个指向它的老爹,一个指向下一个节点。所以要实现类型识别,只要通过指向老爹的这条线就可以了。链表的这条线是为了动态创建。
动态创建是为了程序在运行时能够用同一方法创建一个指定的类的对象(类型识别是为了程序在运行是能够用同一方法判断一个指定的类是不是它的亲人),方法是在CRuntimeClass这个静态的结构体中添加了两个成员函数并給类添加了一个静态成员函数CreateObject(),这个CreateObject()就是用来new一个这个类的对象,而CRuntimeClass中添加的两个成员函数一个是CreateObject(),这个RuntimeClass的CreateObject()通过RuntimeClass中的一个指向类的CreateObject()函数的函数指针调用类的CreateObject()函数来新建对象, 另 一个RuntimeClass添加函数是静态的Load(),用来载入新建对象用的数据。
我们要创建某一个类的对象,只要遍历这个链表,找到这个类的CRuntimeClass,(注意,CRuntimeClass的结构体是静态的,只要定义了类,哪怕不生成实例,每个类的CRuntimeClass结构体也出生了) ,利用CRuntimeClass的成员函数来动态创建指定类的对象。
你有可能要问,我要创建一个对象,定义一个不就行了,别忘了,我要的是动态创建,你可能又要说,我可以直接new一个对象,可new一个对象的方法不能实现代码的通用化,在模块化设计的今天,通用化是非常重要的