码迷,mamicode.com
首页 > 编程语言 > 详细

MFC框架仿真<三>R T T I

时间:2016-04-04 01:26:29      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

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;
}

 

MFC框架仿真<三>R T T I

标签:

原文地址:http://www.cnblogs.com/tinaluo/p/5351239.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!