003-1 RTTI & 类型转换运算符(完)

RTTI

  1. RTTI(Runtime Type Identification)是运行阶段类型识别的简称
  2. 支持RTTI的元素:dynamic_cast运算符typeid运算符type_info结构
  3. 只能RTTI用于包含虚函数的类层次结构,因为只有对于这种结构,才应该将派生类对象的地址赋给基类指针
  • typeid运算符 & typeinfo类:
  1. typeid运算符用于确定两个对象是否为同种类型
  2. 可接受的参数: 类名结果为对象的表达式
  3. typeid运算符返回一个type_info对象的引用, typeinfo是在头文件typeinfo中定义的一个类
  4. typeinfo重载了运算符==!=用于进行类型比较:
    在这里插入图片描述
  5. pg是一个空指针,上式将引发bad_typeid异常(在头文件typeinfo中声明的)
  6. typeinfo包含一个name成员函数,函数一般返回类的名称

类型转换运算符

旧式转换

  1. C风格的类型转换: (T)expression
  2. 函数风格类型转换: T(expression)
  3. C风格的类型转换函数风格类型转换并无差别
  4. 旧式转换过于松散,容易产生许多无编译错误,但不安全无意义类型转换

dynamic_cast

  1. dynamic类型转换是在运行时而非时编译时进行
  2. 只能用于包含虚函数的类层次结构中指针引用之间进行类型转换
  3. dynamic_cast是唯一可能耗费重大运行成本的转型动作
  • dynamic_cast & 指针:
  1. dynaimc_cast用于指针转换:
    (1)如果能保证安全dynamic_casst运算符将使用一个指向基类的指针来生成一个指向派生类的指针
    (2)否则dynamic_cast返回0,即空指针
  2. 安全: 只有指针类型对象的类型(或对象的直接或间接基类的类型)相同的转换才一定是安全的
  3. 语法: dynamic_cast<Type*>(*pt)
    (1)如果指向的对象(*pt)的类型为Type或者是从Type直接或间接派生而来的类型,则可以将指针pt转换为Type类型的指针
    (2)否则,结果为0,即空指针

在这里插入图片描述

  • dynamic_cast & 引用:
  1. dynamic_cast也可用于引用类型,但当请求不正确时,dynamic_cast将引发类型为bad_cast的异常(在头文件typeinfo中定义),而不是返回空指针

在这里插入图片描述

const_cast

  1. 语法:const_cast< type-name > (expression)
  2. 用法: 改变值为const非const
  3. type-name必须为指针引用类型
  4. const_cast只能调节类型限定符,不能更改基础类型
  5. 除了有无const外,type-nameexpression的类型必须相同
High bar;
const High * pbar= &bar;
High * pb = const_cast<High *>  //允许的
const Low * pl = const_cast<const Low *> (pbar);  //不允许

static_cast

  1. 语法:static_cast<type-name> (expression)
  2. 条件(满足条件之一即可):
    (1) expression可被隐式转换为type-name所属的类型
    (2) type-name可被隐式转换为expression所属的类型
  3. 用法:
    (1)基本类型之间的转换
    (2)具有继承关系的类型的转换
  4. static_cast无法将const的指针或引用转为non-const的指针或引用

reinterpret_cast

  1. 作用: 将一个类型的指针转换为另一个类型
  2. 不允许删除const限定符,即不能替代const_cast
  3. reinterprete_cast运算符无法将指针转换为浮点型
  4. reinterprete_cast运算符无法将函数指针转换为数据指针
	int  d = 297;
	int* pd = &d;
	char* pi = reinterpret_cast<char*>(pd);
	cout << *pi << endl;   //显示:(
	cout << *pd << endl;   //显示:297
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_46427273

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值