`
fujinbing
  • 浏览: 237237 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dynamic_cast static_cast

    博客分类:
  • c++
 
阅读更多

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 只能用在类层次结构中转换

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics