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