C++中RTTI与dynamic_cast

本文介绍了C++中的RTTI(运行时类型识别)和dynamic_cast的使用,包括它们在多态类层次间的转换作用。通过示例分析了dynamic_cast如何在存在虚函数的类之间进行安全转换,并探讨了其与RTTI的关系,以及RTTI的实现原理和type_info对象。

前言
最近看了好些个关于C/C++类的书籍,其中几乎每本都会提到C++的类型强转,然后每本书讲的深浅不一,其中《编写高质量C/C++代码的 150个建议》其中有一段对dynamic_cast的举例说明中出现了陈述错误,可能是作者的失误,将static_cast和dynamic_cast的情况说反了,但是这让原本以为对dynamic_cast还算了解我,瞬间懵逼,难道我原来是记错了? 遂百度求证之,结果证明我还是对的,哈哈,然后再林锐的《高质量C++/C编程指南》第二版一书中,对类型转换进行了更深入的讲解,而且此书中对RTTI的讲解也是让我茅塞顿开,下面我就细细道来!


<一>C++的显示类型转换

这个首先,我觉得我们还是得从类型转换讲起;
(既然有显示那么也是有隐式的,不过这里不对隐式转换赘述;)

1.1>四种类型转换运算符
static_cast
static_cast的转换格式:static_cast (expression)

将expression转换为type-id类型,主要用于非多态类型之间的转换,不
提供运行时的检查来确保转换的安全性。主要在以下几种场合中使用:

1.用于类层次结构中,基类和子类之间指针和引用的转换;
当进行上行转换,也就是把子类的指针或引用转换成父类表示,这种转换是安全的;当进行下行转换,也就是把父类的指针或引用转换成子类表示,这种转换是不安全的,也需要程序员来保证;

2.用于基本数据类型之间的转换,如把int转换成char,把int转换成enum等等,这种转换的安全性需要程序员来保证;

3.把void指针转换成目标类型的指针,是及其不安全的;
注:static_cast不能转换掉expression的const、volatile和__unaligned属性。

dynamic_cast
dynamic_cast的转换格式:dynamic_cast (expression)

将expression转换为type-id类型,type-id必须是类的指针、类的引用或者是void *;如果type-id是指针类型,那么expression也必须是一个指针;如果type-id是一个引用,那么expression也必须是一个引用。

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。在多态类型之间的转换主要使用dynamic_cast,因为类型提供了运行时信息;

《引自百度百科》
const_cast :去除对象的const和volatile属性;
reinterpret_cast:允许将任何指针类型转换为其它的指针类型(慎用!!!)

const_cast和reinterpret_cast 不做赘述~


<二> 细说dynamic_cast
2.1 多态
多态这个真的是C++最难理解的内容之一了;我不敢保证我可以把多态讲清楚,但是这里又不得不提多态,dynamic_cast 只适用于含有虚函数的类之间的转换,所以,

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值