RTTI运行时刻类型识别

                                                                                      (文章总结自——《C++Primer》第三版)

RTTI(运行时刻类型识别)允许“用指向基类的指针或引用来操纵对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。

在C++中,为了支持RTTI提供了两个操作符:dynamic_cast操作符和typeid操作符。 

1、dynamic_cast操作符

(1)使用dynamic_cast操作符的原因:

在某些情况下,不希望扩展类库,就不能增加虚拟成员函数,但是仍然希望可以增加功能的时候,就必须使用dynamic_cast。

使用dynamic_cat来解决上述问题的一般思路是:

首先在我们想要扩展的那个类库的定义中增加我们希望添进去的函数的声明,然后再我们自己的程序文本文件中定义这个新的成员函数。

(2)dynamic_cast操作符的作用:

在操作的类型必须至少带有一个虚拟函数的基础上,然后在运行时刻进行类型转换,把一个类类型对象的指针转换成同一类层次结构中的其他类的指针,同时也可以用它把一个类类型对象的左值转换成同一类层次结构中其他类的引用。

(3)操作符的调用结果

dynamic_cast操作符一次执行两个操作,它先检验请求的转换是否真的有效,然后在有效的前提下再进行转换。

对指针类型的dynamic_cast失败,则dynamic_cast的结果是0。

对引用类型的dynamic_cast失败,则会抛出bad_cast类型(包含在<type_info>)的异常。

(4)什么时候使用针对引用的dynamic_cast,什么时候使用针对指针的?

这个在于程序员的选择,只不过需要明确的是,使用针对引用的dynamic_cast操作符,对于失败的转换在没有测试它的结果前这种情况就会抛出异常,程序员就不可能忽略这种情况。但是使用针对指针的dynamic_cast操作符,程序员可能会忽略这种失败的情况,导致程序出现问题。其次,使用针对引用的dynamic_cast操作符,由于它在失败的情况下会抛出异常,增加了相应的运行开销。

2、typeid操作符

(1)typeid操作符的作用:

可以获取一个表达式的类型。此外在操作的类型必须至少带有一个虚拟函数的基础上,能够指出指针或引用指向的对象的实际派生类型。比如:如果表达式是一个基类的引用,则typeid会指出底层对象的派生类类型。

(2)使用typeid操作符的注意事项:

①必须与表达式或类型名一起使用。

②当typied操作符的操作数是类类型,但不是带有虚拟函数的类类型时,typied操作符会指出当前这个操作数直接被定义的类型,而不是底层对象的类型,例如:

class Base{/*没有虚拟函数*/};

class Object:public Bae{/*没有虚拟函数*/};

Object obj;

Base* ba=&obj;

cout<<typied(ba).name()<<endl;//打印base

③可以对typied的结果进行比较

④typied操作返回type_info的类对象,type_info类被定义在<type_info>中。

⑤扩展RTTI,可以将type_info类(提供了虚析构)作为基类,然后进行派生类,派生类进行相应的扩展。判断是否扩展就可以使用dynamic_cast操作符将基类转换为派生类,如果dynamic_cast操作符操作成功,表示能够将type_info类转换为它对应的派生类,说明存在派生类的扩展,如果dynamic_cast操作失败,表名不能将type_info类转换为它对应的派生类,说明没有对应的派生类扩展。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

仟各

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

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

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

打赏作者

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

抵扣说明:

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

余额充值