zoukankan      html  css  js  c++  java
  • C++之运行时类型识别RTTI

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
     
    /*
        名称:C++ 运行时类型识别
        作者:Michael Joessy
        日期:2017-06-06
        知识:Run-Time Type Information
        通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
        typeid  dynamic_cast
        注意:
        dynamic_cast:
            只能用于指针和引用的转换;
            要转换的类型中必须包含虚函数;
            转换成功返回子类的地址,失败返回NULL.
        typeid:
            typeid返回一个type_info(#include <typeinfo>)对象的引用;
            如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数;
            只能获取对象的实际类型.
    */


    /*
        class type_info {
        public:
        virtual ~type_info();
        _CRTIMP_PURE bool __CLR_OR_THIS_CALL operator==(const type_info& rhs) const;
        _CRTIMP_PURE bool __CLR_OR_THIS_CALL operator!=(const type_info& rhs) const;
        _CRTIMP_PURE int __CLR_OR_THIS_CALL before(const type_info& rhs) const;
        _CRTIMP_PURE const char* __CLR_OR_THIS_CALL name(__type_info_node* __ptype_info_node = &__type_info_root_node) const;
        _CRTIMP_PURE const char* __CLR_OR_THIS_CALL raw_name() const;
        private:
        void *_m_data;
        char _m_d_name[1];
        __CLR_OR_THIS_CALL type_info(const type_info& rhs);
        type_info& __CLR_OR_THIS_CALL operator=(const type_info& rhs);
        _CRTIMP_PURE static const char *__CLRCALL_OR_CDECL _Name_base(const type_info *,__type_info_node* __ptype_info_node);
        _CRTIMP_PURE static void __CLRCALL_OR_CDECL _Type_info_dtor(type_info *);
        };
    */


    #include <iostream>
    #include <string>
    #include <typeinfo>
    using namespace std;

    class Flyable
    {
    public:
        
    virtual void takeoff() = 0;   //起飞
        virtual void land() = 0;      //着陆
             
    protected:
    private:
    };

    class Bird : public Flyable
    {
    public:
        
    void forageing()             //觅食
        {
            cout << 
    "Bird->forageing()" << endl;
        }
        
    virtual void takeoff()       //起飞
        {
            cout << 
    "Bird->takeoff()" << endl;
        }
        
    virtual void land()         //着陆 
        {
            cout << 
    "Bird->land()" << endl;
        }
    protected:
    private:
    };

    class Plane : public Flyable
    {
    public:
        
    void carry()                 //运输
        {
            cout << 
    "Plane->carry()" << endl;
        }
        
    virtual void takeoff()       //起飞
        {
            cout << 
    "Plane->takeoff()" << endl;
        }
        
    virtual void land()          //着陆
        {
            cout << 
    "Plane->land()" << endl;
        }
    protected:
    private:
    };

    void doSomething(Flyable* pObj)
    {
        cout << 
    typeid(*pObj).name() << endl;
        pObj->takeoff();
        
    if (typeid(*pObj) == typeid(Bird))
        {
            Bird* pBird = 
    dynamic_cast<Bird*>(pObj);
            
    if (pBird)
            {
                pBird->forageing();
            }
        }
        
    if (typeid(*pObj) == typeid(Plane))
        {
            Plane* pPlane = 
    dynamic_cast<Plane*>(pObj);
            
    if (pPlane)
            {
                pPlane->carry();
            }
        }
        pObj->land();
    }

    int main(void)
    {
        Flyable* pObj1 = 
    new Bird;
        Flyable* pObj2 = 
    new Plane;
        doSomething(pObj1);
        doSomething(pObj2);

        
    /************************************************************************/
        
    /* typeid usage                                           
        /************************************************************************/

        
    int nNumber = 23;
        cout << 
    typeid(nNumber).name() << endl;

        Flyable* p = 
    new Bird;
        cout << 
    typeid(p).name() << endl;
        cout << 
    typeid(*p).name() << endl;

        cin.get();
        
    return 0;
    }

  • 相关阅读:
    Ubuntu配置sublime text 3的c编译环境
    ORA-01078错误举例:SID的大写和小写错误
    linux下多进程的文件拷贝与进程相关的一些基础知识
    ASM(四) 利用Method 组件动态注入方法逻辑
    基于Redis的三种分布式爬虫策略
    Go语言并发编程总结
    POJ2406 Power Strings 【KMP】
    nyoj 会场安排问题
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
    Java的String、StringBuffer和StringBuilder的区别
  • 原文地址:https://www.cnblogs.com/MakeView660/p/6950057.html
Copyright © 2011-2022 走看看