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、基类必须带有虚函数,否则通过基类获得的数据类型依旧是基类
两个重要的哼哈二将: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、基类必须带有虚函数,否则通过基类获得的数据类型依旧是基类
相关文章推荐
- RTTI(Run-Time Type Identification,通过运行时类型识别)
- c++模拟MFC中运行时类型识别(RTTI)(Run-Time Type Identification)
- The C++ Standard Library: RTTI(Run-Time Type Identification,运行时类型识别)
- RTTI (Run-Time Type Identification,通过运行时类型识别)
- C++ Run-Time Type Identification(RTTI)运行时类型识别
- Java RTTI(Run-Time Type Identification) 运行时类型识别
- 行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制 多态 类加载
- RTTI(Run-Time Type Information,通过运行时类型信息) 运行期类型检查
- RTTI运行阶段类型识别(Runtime Type Identification)
- RTTI(RunTime Type Identification,运行时类型识别)
- MFC中的RTTI(Runtime Type Identification, 运行时类型识别)详解(参考《深入浅出MFC》)
- RTTI(Run-Time Type Identification)
- 迷思微软两大框架的RTTI(Run-Time Type Identification)
- 7.3 执行期类型识别(Runtime Type Identification,RTTI)
- Advanced Run Time Type Identification in C++ Part II(Property Library An Implementation of RTTI in C++)
- RTTI运行时类型识别typeid,type_info,dynamic_cast关建字
- ABAP RTTI(Run Time Type Identification)介绍与反射机制
- 从头认识java-12.1 为什么需要RTTI(Run-Time Type Identification)?
- Lession 26 RTTI (Run Time Type Identification)
- moon RTTI --running-time type identification运行时类型确定