通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型。c++通过下面两个操作符提供RTTI。
(1)typeid:返回指针或引用所指对象的实际类型。   

(2)dynamic_cast:将基类类型的指针或引用安全的转换为派生类型的指针或引用。

对于带虚函数的类,在运行时执行RTTI操作符,返回动态类型信息;对于其他类型,在编译时执行RTTI,返回静态类型信息。

当具有基类的指针或引用,但需要执行派生类操作时,需要动态的强制类型转换(dynamic_cast)。这种机制的使用容易出错,最好以虚函数机制代替之。
 

dynamic_cast 操作符

如果dynamic_cast转换指针类型失败,则返回0;如果转换引用类型失败,则抛出一个bad_cast的异常。

可以对值为0的指针使用dynamic_cast,结果为0。
 
class People
{
public:
People(){}
People(int size):m_size(m_size){}
virtual ~People(){}
private:
int m_size;
}; class Son : public People
{
public:
Son(int type):m_type(type){}
virtual ~Son(){}
int getType(){return this->m_type ; }
private:
int m_type; }; int main()
{ People *p = new People(12);
Son *s = new Son(10); //
People *p1 = new Son(34); s = dynamic_cast<Son*>(p1) ; cout << typeid(*s).name() << endl;
cout << typeid(*p1).name() << endl; try{
Son &tmp = dynamic_cast<Son &>(*p1); cout << tmp.getType() << endl;
}catch(bad_cast)
{
// �����;
}

  

 
 
 

typeid操作符

typeid能够获取一个表达式的类型:typeid(e)。

如果操作数不是类类型或者是没有虚函数的类,则获取其静态类型
如果操作数是定义了虚函数的类类型,则计算运行时类型。
         
 
 — 静态  

  typeid最常见的用途是比较两个表达式的类型,或者将表达式的类型与特定类型相比较。

  包含  #include <typeinfo>  

struct B {} b, c;
struct D : B {} d; int main(){
const std::type_info& tb = typeid(b);
const std::type_info& tc = typeid(c);
const std::type_info& td = typeid(d);
assert(tb == tc); // b和c具有相同的类型
assert(&tb == &tc); // tb和tc引用的是相同的对象
assert(tb != td); // 虽然D是B的子类,但是b和d的类型却不同
assert(&tb != &td); // tb和td引用的是不同的对象
}

二 运行时运行识别

  typeid 实现运行时类型识别,必须时一个动态类(含有虚函数 virtual)

struct B { virtual void foo() {} };
struct C { virtual void bar() {} };
struct D : B, C {};
void test() {
D d;
B& rb = d;
C& rc = d;
assert(typeid(rb) == typeid(d)); // rb引用的类型与d相同
assert(typeid(rb) == typeid(rc)); // rb引用的类型与rc引用的类型相同
}

 

最新文章

  1. oracle 空间大小查询
  2. struts2获取web元素的方式和方法
  3. Android -- 创建数据库到SD卡
  4. python:open文件操作
  5. JDBC入门try/catch型
  6. ARM学习笔记13——LED驱动程序设计
  7. centos7如何关闭防火墙
  8. Recurrent Neural Network系列2--利用Python,Theano实现RNN
  9. 一步一步从原理跟我学邮件收取及发送 8.EHLO 命令详解
  10. logging日志
  11. nyoj 开方数
  12. JVM Class字节码之三-使用BCEL改变类属性
  13. linux环境下在springboot项目中获取项目路径(用于保存文件等)
  14. vue的一些随记
  15. 使用密钥登录CentOS系统(基于密钥的认证)
  16. cmd &amp; tree &amp; bash
  17. 【BZOJ3236】【AHOI2013】作业 线段树 分治 树状数组
  18. 步步为营-21-xml的增删改查
  19. 读&ldquo;40 分,60 分,90 分&rdquo;
  20. 二叉树的遍历--C#程序举例二叉树的遍历

热门文章

  1. Gc.Db之循序渐进
  2. MVC中得到成员元数据的Description特性描述信息公用方法
  3. android GPS定位源码 地图显示位置源码 有用到的小伙伴自提取
  4. memcache占用CPU过高的解决办法
  5. fsr
  6. Day7-面向对象
  7. 了解一下C++输入和输出的概念
  8. Nike Zoom Winflo 2 Kvinder Sko N&#229;r jeg set elementet
  9. 纯CSS3实现动态导航栏目
  10. MySQL安装与设置