RTTI
RTTI(Runtime Type Identification)
是运行阶段类型识别的简称- 支持
RTTI
的元素:dynamic_cast运算符
、typeid运算符
、type_info结构
- 只能
RTTI
用于包含虚函数
的类层次结构,因为只有对于这种结构,才应该将派生类对象的地址
赋给基类指针
typeid
运算符用于确定两个对象
是否为同种类型
可接受的参数:
类名
或结果为对象的表达式
typeid
运算符返回一个type_info
对象的引用, typeinfo
是在头文件typeinfo
中定义的一个类typeinfo
重载了运算符==
和!=
用于进行类型比较:
![在这里插入图片描述](https://img-blog.csdnimg.cn/fe111bf1e05c4e58afe8da26258b112c.png#pic_center)
- 若
pg
是一个空指针
,上式将引发bad_typeid
异常(在头文件typeinfo
中声明的) typeinfo
包含一个name
成员函数,函数一般返回类的名称
类型转换运算符
旧式转换
C风格的类型转换:
(T)expression
函数风格类型转换:
T(expression)
C风格的类型转换
和函数风格类型转换
并无差别- 旧式转换
过于松散
,容易产生许多无编译错误
,但不安全
或无意义
的类型转换
dynamic_cast
- 该
dynamic类型
转换是在运行时
而非时编译时
进行 - 只能用于包含
虚函数
的类层次结构中指针
或引用
之间进行类型转换
dynamic_cast
是唯一可能耗费重大运行成本的转型动作
dynaimc_cast用于指针转换:
(1)如果能保证安全
,dynamic_casst运算符
将使用一个指向基类的指针
来生成一个指向派生类的指针
(2)否则dynamic_cast
返回0,即空指针
安全:
只有指针类型
与对象的类型
(或对象的直接或间接基类的类型
)相同的转换才一定是安全的语法:
dynamic_cast<Type*>(*pt)
(1)如果指向的对象(*pt)
的类型为Type
或者是从Type
直接或间接派生而来的类型,则可以将指针pt
转换为Type
类型的指针
(2)否则,结果为0,即空指针
![在这里插入图片描述](https://img-blog.csdnimg.cn/b2e14cb91bc149ddbc5b1f7e94b36da8.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ2NDI3Mjcz,size_16,color_FFFFFF,t_70#pic_center)
dynamic_cast
也可用于引用类型
,但当请求不正确时,dynamic_cast
将引发类型为bad_cast
的异常(在头文件typeinfo
中定义),而不是返回空指针
![在这里插入图片描述](https://img-blog.csdnimg.cn/c22421d1422941b3a49b3129c21ed75a.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ2NDI3Mjcz,size_16,color_FFFFFF,t_70#pic_center)
const_cast
- 语法:
const_cast< type-name > (expression)
- 用法: 改变值为
const
或非const
type-name
必须为指针
或引用
类型const_cast
只能调节类型限定符,不能更改基础类型- 除了
有无const
外,type-name
和expression
的类型必须相同
High bar;
const High * pbar= &bar;
High * pb = const_cast<High *>
const Low * pl = const_cast<const Low *> (pbar);
static_cast
- 语法:
static_cast<type-name> (expression)
- 条件(满足条件之一即可):
(1) expression
可被隐式
转换为type-name
所属的类型
(2) type-name
可被隐式
转换为expression
所属的类型 - 用法:
(1)基本类型
之间的转换
(2)具有继承关系
的类型的转换 static_cast
无法将const
的指针或引用转为non-const
的指针或引用
reinterpret_cast
- 作用: 将一个类型的
指针
转换为另一个类型 - 不允许删除
const
限定符,即不能替代const_cast
reinterprete_cast
运算符无法将指针转换为浮点型
reinterprete_cast
运算符无法将函数指针
转换为数据指针
int d = 297;
int* pd = &d;
char* pi = reinterpret_cast<char*>(pd);
cout << *pi << endl;
cout << *pd << endl;