C++ 类型转换

本文介绍了C++中的四种类型转换方法:static_cast、dynamic_cast、const_cast和reinterpret_cast,强调了它们在编译期和运行时的区别,以及如何确保转换的安全性和适用场景。特别关注了动态类型检查、RTTI的应用以及特定继承结构(如虚函数、钻石继承)的影响。
摘要由CSDN通过智能技术生成

static_cast

在编译期间确定类型转换,不保证安全性

程序员要自己保证转换的安全性

dynamic_cast

运行时类型检查, 有额外的运行时开锁

保证安全性, 在不能转换时返回 nullptr

无法使用 dynamic_cast 的情况

  1. dynamic_cast 需要运行时类型信息(RTTI, run-time type identification), 所以无虚方法的子类父类无法使用 dynamic_cast 转换
  2. 对于非公有的继承关系 dynamic_cast 会 fail 并返回 nullptr
  3. 存在 dreaded diamond 继承关系的情况下,编译不通过, 比如以下情况,将 TA 转为 Person会报错:'Person' is an ambiguous base of 'TA'

const_cast

对一个变量添加或去除 const 属性

reinterpret_cast

最危险的 cast, 可以理解为直接改变了编译器对相应地址的解释方式

父子类换转场景总结

可选方案
无虚方法子类父类的相互转换

1. c 式强转

2. static_cast

有虚方法父类子类相互转换

1. c 式强转

2. static_cast

3. dynamic_cast

参考

Multiple Inheritance in C++ - GeeksforGeeks

c++ - When should static_cast, dynamic_cast, const_cast, and reinterpret_cast be used? - Stack Overflow

C++类型转换:static_cast和dynamic_cast - 知乎

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值