每日一记----------dynamic_cast

类型检查有两种方式:编译时检查,与运行时识别,

 

RTTI( 运行时类型识别)C++有较强的类型检查机制,RTII机制的两个符号及typeid及dynamic_cast,

1、typeid

C++为每种类型包括基本类型与自定义类型都定义了一个type_info对象,该对象有一个name函数返回对应类型的字符串名字,typeid即返回其对象的对应type_info对象。

2、dynamic_cast

dynamic_cast是C++提供的一个对有继承关系类的指针或对象引用的一个转换函数

C++下尽量少用c的强制类型转换

写法:dynamic_cast<type-id>(expression)

其中typeif为指针或引用类型,或void*

expression为指针或是一个可用的左值

class A{};

class B: public A{};

如上继承关系,A是b的父类

B* pb = new B;
A* pa = dynamic_cast<A*>(pb);

如上就是一种“向上转换”即 upcast,这是被C++允许的,是隐式的转换。这时不会发生错误。

而要实现这种机制编译器要保存一颗树,当发生dynamic_cast是查询这棵树,发现A 与B 是一种is a的关系,因此转换成功。

A* pa = new B;
B *pb = dynamic_cast<B*>(pa);

上面的转换时一种“向下转换” downcast

这时转换是否成功取决于pa是否为B 类型的指针。上面转换时正确的。

A* pb = new A;
B* pa = dynamic_cast<B*>(pb);

因pb不是指向B的指针因此转换失败。

转换失败如果是指针则pa = NULL,如果是引用则抛出std::bad_cast异常。




 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值