C++学习之多态篇(运行时类型识别--RTTI(typeid和dynamic_cast))

1.使用方式:


dynamic_cast的使用说明:

(1)只能有用于指针和引用的转换,将父类指针或引用转换为子类指针和引用

(2)要转换的类型中必须包含虚函数

(3)如果转换成功,返回的就是子类的地址,如果转换失败,返回NULL

typeid的使用说明:

(1)返回一个type_info对象的引用,type_info类的结构见下图:

(2)如果想通过基类的指针获得派生类的数据类型,那么基类必须带有虚函数

(3)typeid只能获取对象的实际类型,没法判断某个指针是基类还是子类,必须加*

typeid(*obj)。


2.运行时类型识别RTTI的特点如下:

(1)可以通过父类指针识别其所指向对象的真实数据类型

(2)RTTI必须建立在虚函数的基础上

(3)    

Movable * p = new Bus();
 cout<<typeid(*p).name()<<endl;//打印结果为Bus,返回指针指向的对象的类型
 cout<<typeid(p).name()<<endl;//打印结果为Movable,返回指针本身的类型

(4)  Movable * obj;

 Bus bus = dynamic_cast<Bus&>(*obj);//正确

 Bus bus = dynamic_cast<Bus*>(obj);//正确

 Bus bus = dynamic_cast<Bus>(*obj);//错误,错误详细信息如下:

/474/9251/BNIP/index.cpp: In function 'void doSomething(Movable*)':
/474/9251/BNIP/index.cpp:66:41: error: cannot dynamic_cast '* obj' (of type 'class Movable') to type 'class Bus' (target is not pointer or reference)
         Bus bus = dynamic_cast(*obj);
                                        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值