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 新特性