【C++】运行时类型识别RTTI与反射详解

RTTI

RTTI(Run-Time Type Information)运行时类型识别的英文缩写,它提供了运行时确定对象类型的方法。面向对象的编程语言,像C++,Java,delphi都提供了对RTTI的支持。 本文将描述 RTTI 的概念、简略介绍 RTTI 的一些背景知识、并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI的两个重要运算符 typeid dynamic_cast的使用方法。

背景知识

其实,RTTI 在C++中并不是什么新的东西,它早在十多年以前就已经出现了。但是大多数开发人员,包括许多高层次的C++程序员对它并不怎么熟悉,更不用说使用 RTTI 来设计和编写应用程序了。
  一些面向对象专家在传播自己的设计理念时,大多都主张在设计和开发中明智地使用虚拟成员函数,而不用 RTTI 机制。但是,在很多情况下,虚拟函数无法克服本身的局限。每每涉及到处理异类容器和根基类层次(如 MFC)时,不可避免要对对象类型进行动态判断,也就是动态类型的侦测。如何确定对象的动态类型呢?答案是使用内建的 RTTI 中的运算符:typeid 和 dynamic_cast。

运算符

1.type_info

type_info类在头文件<typeinfo>中定义,代表了一个C++类型的相关信息。一般由typeid操作符返回,不能自己构造。

type_info是实现相关的,不同编译工具链的实现可能不一致。

下面的代码可以打印出int类型的名字:

    const std::type_info &tiInt = typeid(int);
    std::cout << "tiInt.name = " << tiInt.name() << std::endl;

type_info有下列方法:

  • name(),返回类型的名字
  • hash_code(),返回这个类型的哈希值(具有唯一性)
  • before(),可以判断一个type_info对象的顺序是否在另一个之前(实现相关,同一个程序多次调用都可能不一样,不太理解有什么实际作用)
  • ==和!=操作符,判断两个type_info相等或不等

2.typeid操作符

typeid操作符在<typeinfo>中声明,用来在运行时获取类型、变量、表达式的类型信息,适用于C++基础类型、内置类、用户自定义类、模板类等。typeid的操作是在编译时期就已经决定的了。

它有两种形式:

  • typeid( 类型 )
  • typeid( 表达式 )

具体用法前面的示例代码已有了。

3.type_index(C++11 新特性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值