您的位置:首页 > 编程语言 > C语言/C++

RTTI的魅力(运行时类型识别 Run-time type Identification)

2017-07-15 11:09 561 查看
一句话总结:实际运行时检查指针或者引用指向的实际派生类型。

两个重要的哼哈二将:typeid、dynamic_cast

#ifndef CRTTI_hpp

#define CRTTI_hpp

#include <iostream>

class CPerson

{

public:

    void getup(){std::cout<<"getup..."<<std::endl;}

    void sleep(){std::cout<<"sleep..."<<std::endl;}

    virtual ~CPerson(){}//这个很重要,没有这个,RTTI就不要玩了

public:

    int age;

    int tall;

};

class CFarmer: publicCPerson

{

public:

    void farming(){std::cout<<"farming..."<<std::endl;};

};

class CWorker: publicCPerson

{

public:

    void building(){std::cout<<"building..."<<std::endl;};

};

#endif /* CRTTI_hpp */

#include <iostream>

#include "CRTTI.hpp"

using namespacestd;

void doAction(CPerson* obj)

{

    cout<<typeid(*obj).name()<<endl;

    obj->getup();

    if (typeid(*obj) ==typeid(CFarmer))
{

        CFarmer* farmer =dynamic_cast<CFarmer*>(obj);

        farmer->farming();

    }

    else{

        cout<<"who are you"<<endl;

    }

    obj->sleep();

}

int main(int argc,const
char * argv[]) {

    // insert code here...

    CFarmer farmer;

    doAction(&farmer);

    CWorker *worker =new
CWorker();

    doAction(worker);

    delete worker;

    return0;

}

运行结果:

7CFarmer

getup...

farming...

sleep...

7CWorker

getup...

who are you

sleep...

Program ended with exit code: 0

dynamic_cast注意事项:

1、只能应用于指针和引用之间的转换

2、要转换的类型中必须包含虚函数

3、转换成功返回子类的地址,失败返回null

typeid注意事项:

1、type_id返回一个type_info对象的引用

2、基类必须带有虚函数,否则通过基类获得的数据类型依旧是基类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 继承