dynamic_cast static_cast

本文深入探讨了C++中用于类型转换的static_cast和dynamic_cast函数,详细阐述了它们的应用场景、区别及注意事项。重点区分了在类层次结构中的使用方式,包括基类与派生类、基本数据类型之间的转换,以及兄弟类间的转换,并强调了两者在安全性、编译错误等方面的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c++ 中定义了一些类型转换函数,如:static_cast,dynamic_cast等。

一、 static_cast 用在如下四种情况。

      1.类的层次结构中,基类与派生类之间指针与引用的转换

           1.) 派生类 =>基类 是安全的,应为派生类包含基类部分。

           2.) 基类 =>派生类,是不安全的,需要程序员保证。

      2.用于基本数据类型之间的转换,如 int转为char, int 转为enum,这种转换也需要程序员来保证。

      3.把空指针 =》其他类型空指针

     

注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性

 

二、dynamic_cast

       1.类的层次结构中,基类与派生类之间指针与引用的转换             

           1.) 派生类 =>基类 是安全的,应为派生类包含基类部分。

           2.) 基类 =>派生类,也是安全的

             这种用法与static_cast极其类似,只是dynamic_cast会进行类型检查,若该对象不为派生类型,

             则返回NULL

        2.类的层次结构中,兄弟类型之间,主要用在多继承中。

           如 D 继承B,B1,可以实现B类型转换为B1类型。若不是目标类型,返回为NULL。

            B b=new D;

            dynamic_cast<B1>(b) // ok

            B b =new B;

            dynamic_cast<B1>(b) // NULL

 

三、static_cast 与 dynamic_cast 差别。

  1.static_cast 在类层次结构中转换,不能用在兄弟之间,编译报错。

            B b=new D;

            dynamic_cast<B1>(b) //  compile error

 

  2.static_cast 不安全,对于类型有问题是,当前可以运行,具有安全隐患。

  3.dynamic_cast 只能用在 类(基类)中有virtual函数的类中,若没有,编译报错。

      这一点说明可以大致简单理解,编译器的设计是 ,没有虚类的类中,没有必要cast.

      gcc error  source type is not polymorphic

  4.dynamic_cast 只能用在类层次结构中转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值