应用到类的指针上,它允许子类类型的指针转换为父类类型的指针(upercasting这是一个有效的隐式转换);也能够执行相反动作,即转换父类为它的子类(downcasting),这种转换的安全性需要开发人员来保证(主要是在非上下转型中)。

 

class Base {};
class Derived : public Base {};
Base *a = new Base;
Derived *b = NULL;
b = static_cast<Derived *>(a); //可以通过编译,但存在安全隐患(如访问//Derived的成员)

  注意:
  1.static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
  2.在非基本类型或上下转型中,被转换的父类需要检查是否与目的类型相一致,否则,如果在两个完全不相干的类之间进行转换,将会导致编译出错。
  1.4       dynamic_cast
  只用于对象的指针和引用,主要用于执行“安全的向下转型”,也是说,要确定一个对象是否是一个继承体系中的一个特定类型。它是不能用旧风格语法执行的强制转型,也是可能有重大运行时代价的强制转型。
  当用于多态类型时(包含虚函数),它允许任意的隐式类型转换以及相反过程。不过,与static_cast不同,在后一种情况里(即隐式转换的相反过程),dynamic_cast根据RTTI信息检查操作是否有效。即在转换时dynamic_cast会检查转换是否能返回一个被请求的有效的完整对象。这种检查不是语法上的,而是真实情况的检查。检测在运行时进行,如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL。
  先看RTTI相关部分,通常,许多编译器都是通过vtable找到对象的RTTI信息的,这也意味着,如果基类没有虚函数,也无法判断一个基类指针变量所指对象的真实类型, 这时候dynamic_cast只能用来做安全的转换(upercasting),如从派生类指针转换成基类指针,而这种转换其实并不需要dynamic_cast参与。

 

class Base { virtual dummy() {} };
class Derived : public Base {};
class Other{} ;
Base* b1 = new Derived;
Base* b2 = new Base;
Derived* d1 = dynamic_cast<Derived *>(b1);  // succeeds
Derived* d2 = dynamic_cast<Derived *>(b2);  // fails: returns 'NULL'
//如果一个引用类型执行了类型转换并且这个转换是不可能的,运行时一个bad_cast的异常类型会被抛出:
Derived d3 = dynamic_cast<Derived &>(*b1);  // succeeds
Derived d4 = dynamic_cast<Derived &>(*b2);  // fails: exception thrown

  注意:Base需要有虚函数,否则会编译出错。
  1.5       小结
  reinpreter_cast是地址的“生搬硬套”二进制拷贝。const_cast修改类型的const或volatile属性,功能非常明确。
  static_cast在更宽上范围内可以完成映射,这种不加限制的映射伴随着不安全性。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时(基类需要包含虚函数),dynamic_cast具有类型检查的功能,牺牲了效率,但比static_cast安全。