static_cast与dynamic_cast静态类型转换与运行期类型转换

类型转换是C/C++中重要的一种转换,对于内置类型的转换,其往往伴随着精度丢失或者转换失败。

而对于继承体系中的类类型转换,可分为两大类别:

  • 向上转换:将派生类的指针引用转换为基类的指针或引用,根据里式替换规则,这类转换是安全的。
  • 向下转换:将基类的指针引用转换为派生类的指针或引用,由于不确定基类指针实际指向,所以这类转换是不安全的。

 

C++实现多态的核心是虚函数,其一种通俗的描述是:通过基类指针引用指向不同的子类,而采取统一地调用方法,虚函数机制能够确保根据实际的指向对象不同调用相应的函数。

 

关于类型转换,C++中提供两种转换实现:

static_cast:静态类型转换,在编译器完成类型转换的语法检查,针对向上转换,其是安全的,但对于向下转换,其无法确保安全性

dynamic_cast:运行期类型转换,其会在运行期检查基类指针和引用是否实际指向相应的待转换类型。即检查向下转换的安全性。

 

具体dynamic_cast如何在运行期检查实际的指向类型?

其通过运行期类型检查的功能,也就是RTTI 只能用在含有虚函数的机制体系中

具体做法是通过Vptr访问到虚函数表,而虚函数表中头部存放着指向类型信息结构体的指针

通过该指针访问到类型信息结构体,由此确定实际类型。

因此,支持RTTI以及虚函数,就需要额外的空间和时间开销。

大量使用dynamic_cast造成性能下降,在确定实际类型时使用static_cast将更加高效。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值