追根究底,mfc六大关键技术之剖析(第二部分)
二.运行时类型识别(rtti) 【程序编程相关:编程建立IIS站点和虚拟目录(2)(实现】小李先生 【推荐阅读: WMI使用说明(翻译) 】if (typeid (classname)== typeid(*objectname)){ 【扩展信息:编程建立IIS站点和虚拟目录(1)(头文】运行时类型识别(rtti)即是程序执行过程中知道某个对象属于某个类,我们平时用c++编程接触的rtti一般是编译器的rtti,即是在新版本的vc++编译器里面选用“使能rtti”,然后载入typeinfo.h文件,就可以使用一个叫typeid()的运算子,它的地位与在c++编程中的sizeof()运算子类似的地方(包含一个头文件,然后就有一个熟悉好用的函数).typdid()关键的地方是可以接受两个类型的参数:一个是类名称,一个是对象指针.所以我们判别一个对象是否属于某个类就可以象下面那样:((classname*)objectname)->fun();}象上面所说的那样,一个typeid()运算子就可以轻松地识别一个对象是否属于某一个类,但mfc并不是用typeid()的运算子来进行动态类型识别,而是用一大堆令人费解的宏.很多学员在这里很疑惑,好象mfc在大部分地方都是故作神秘.使们大家编程时很迷惘,只知道在这里加入一组宏,又在那儿加入一个映射,而不知道我们为什么要加入这些东东.其实,早期的mfc并没有typeid()运算子,所以只能沿用一个老办法.我们甚至可以想象一下,如果mfc早期就有template(模板)的概念,可能更容易解决rtti问题.所以,我们要回到“古老”的年代,想象一下,要完成rtti要做些什么事情.就好像我们在一个新型(新型到我们还不认识)电器公司里面,我们要识别哪个是电饭锅,哪个是电磁炉等等,我们要查看登记的各电器一系列的信息,我们才可以比较.鉴别,那个东西是什么!要登记一系列的消息并不是一件简单的事情,大家可能首先想到用数组登记对象.但如果用数组,我们要定义多大的数组才好呢,大了浪费空间,小了更加不行.所以我们要用另一种数据结构——链表.因为链表理论上可大可小,可以无限扩展.链表是一种常用的数据结构,简单地说,它是在一个对象里面保存了指向下一个同类型对象的指针.我们大体可以这样设计我们的类:struct cruntimeclass{ ……类的名称等一切信息…… cruntimeclass * m_pnextclass;//指向链表中下一cruntimeclass对象的指针};链表还应该有一个表头与一个表尾,这样我们在查链表中各对象元素的信息的时候才知道从哪里查起,到哪儿结束.我们还要注明本身是由哪能个类派生.... 下一页