一、RTTI:Runtime Type Identification的简称
RTTI用于只适用于包含虚函数的类
- dynamic_cast 运算符将使用一个指向基类的指针来生成一个指向派生类的指针。否则,该运算符返回0--->空指针
- typeid运算符返回一个指出对象的类型的值
- type_info结构存储了有关特定类型的信息
1、dynamic_cast : 回答是否可以安全的将对象的地址赋给特定类型的指针
- 语法:super * pm = dynamic_cast<Super *>(subp)
- 判断指针subp类型可否安全的被转换成super*,如果可以,返回对象的地址,否则,返回一个空指针(0)
- 应尽可能使用虚函数,只在必要时使用RTTI
2、typeid运算符:回答两个对象是否是同种类型 ,返回值是bool
- 参数:类名 或者结果为对象的表达式
- typeid运算符返回一个对type_info对象的引用,其中,type_info是在头文件typeinfo中定义的一个类
- 这个类很显然重载了 == 和!=运算符,以方便比较
- 这个类有一个name() 成员函数,该函数返回一个字符串(内容随厂商而定),一般是类的名称
三、类型转换运算符
通用的格式:
<span style="white-space:pre"> </span>###_cast <type_name> (expression)
- dynamic_cast 使得能够在类层次结构中进行向上转换
- const_cast 改变值为const或volatile ,也就是说只允许两个类型的const或volatile的值不同外,其他属性必须相同,否则转换出错
- static_cast 仅当type_name 可以隐式转换为expression 或者 expression 可以隐式转换为type_name时,才是合法的
- 即基类向派生类转换和派生类向基类转换都是合法的,但是向一个无关的类转换,是非法的
- reinterpret_cast 设计底层编程技术。