标签:
RTTI,简单的说,就是判定A类是否为B类的基类。如图所示,我仿真它的用法,虚构了一个类群,分别列出了各个类的派生层次。
怎么能知道一个类是否是另一个类的基类呢?采用的方法是:每个类中放置一个结构体结点,在这个结点中存放几个指针,其中有一个存放该类基类的结构体地址,然后通过类似链表的形式串连起来。比如说:判定B类是否为A1的基类,首先从A1出发,寻找它的基类,于是得到A,再往下寻找...以此类推,路径为:A1->A->Head->Base->NULL,结果发现这条路径上没有B类,于是判定B不是A1的基类。
完整代码:
/*RTTI识别,将所有宏展开得到的形式*/ #include <iostream> using namespace std; #define BOOL int #define TRUE 1 #define FALSE 0 struct Node /*************节点定义:**************/ { public: Node *next; //下一个类 Node *base;//指向基类 static Node * first;//头结点 }; /*****************Node的连接************/ struct AFX { AFX(Node * pNewClass); }; /***********返回类内部Node的地点**********/ class Base { public: virtual Node * GetRuntimeClass() const; static Node classBase; BOOL IsKindOf(const Node *p)const/*被所有派生类继承*/ { Node * PT = GetRuntimeClass();/*获取类的结构地址*/ while (PT!=NULL)/*遍历路径*/ { if(PT==p) return TRUE; PT=PT->base; } return FALSE; } }; class Head:public Base { public: static Node classHead; virtual Node * GetRuntimeClass()const; }; class A:public Head { public: static Node classA; virtual Node * GetRuntimeClass()const; }; class A1:public A { public: static Node classA1; virtual Node * GetRuntimeClass()const; }; class B:public Head { public: static Node classB; virtual Node * GetRuntimeClass()const; }; /*********全局Node的first赋值*********/ Node * Node::first= NULL; /*************AFX的实现***************/ AFX::AFX(Node * pNewClass)/*和全局的Node::first进行数据交换*/ { pNewClass->next = Node::first; Node::first = pNewClass; } /*---------------对所有类的结构安排和串接-----------------*/ /***************最顶层Base类的描述*****************/ Node Base::classBase ={ NULL,NULL };/*下一个类和基类全为NULL*/ static AFX _init_Base(&Base::classBase); Node * Base::GetRuntimeClass() const{return &Base::classBase;} /**************剩余四个类的安装****************/ Node Head::classHead={NULL,&Base::classBase};/*安装Head,指定基类*/ static AFX _init_Head(&Head::classHead);/*安装next*/ Node * Head::GetRuntimeClass()const{return &Head::classHead;} Node A::classA={NULL,&Head::classHead};/*安装A,指定基类*/ static AFX _init_A(&A::classA);/*安装next*/ Node * A::GetRuntimeClass()const{return &A::classA;} Node A1::classA1={NULL,&A::classA};/*安装A1,指定基类*/ static AFX _init_A1(&A1::classA1); /*安装next*/ Node * A1::GetRuntimeClass()const{return &A1::classA1;} Node B::classB={NULL,&Head::classHead};/*安装B,指定基类*/ static AFX _init_B(&B::classB);/*安装next*/ Node * B::GetRuntimeClass()const{return &B::classB;} /*---------------安装结束-----------------*/ int main() { A1 * p=new A1; cout<<p->IsKindOf(&B::classB);/*判定类A1是否为类B的基类*/ delete (p); return 0; }
标签:
原文地址:http://www.cnblogs.com/tinaluo/p/5351239.html