C++有4种类型转换,reinterpret_cast, static_cast, dynamic_cast 和 const_cast
reinterpret_cast
reinterpret_cast 可以将一个指针转换为任意其它类型的指针或int,或反之亦可。
可以在互不相关的类之间进行指针转换,它只是简单地将一个指针的二进制数据复制到另一个指针,对指针指向的内容不做任何检查或转换。
class A {}; class B {}; A * a = new A; B * b = reinterpret_cast<B*>(a);
static_cast
static_cast 可以执行所有能够隐含执行的类型转换,以及它们的反向操作(即使这种方向操作是不允许隐含执行的)。所谓能够隐含执行的类型转换,简单点说就是合法的转换(不合法的转换比如:指向父类对象的父类指针转为子类指针;两个不相关的类的转换等)
class Base {}; class Derived: public Base {}; Base* a = new Base; Derived* b = static_cast<Derived*>(a);
dynamic_cast
dynamic_cast 完全被用来进行指针的操作。它可以用来进行任何可以隐含进行的转换操作以及它们被用于多态类情况下的合法方向操作。
class Base { virtual void dummy(){}; }; //Base必须有虚函数才能保证多态,编译器会检查Base是否有虚函数 class Derived : public Base { }; Base* b1 = new Derived; Base* b2 = new Base; Derived* d1 = dynamic_cast<Derived*>(b1); // succeeds (父类指针指向子类对象,该指针可以转为子类指针) Derived* d2 = dynamic_cast<Derived*>(b2); // 编译通过!但returns NULL (父类指针指向父类对象,该指针不可转为子类指针)
const_cast
设置或取消常量属性
class A {public:void hello(){}}; A b; const A a = b; //const 声明时必须初始化 //a.hello(); //error, because a is a const object A *a2 = const_cast<A*>(&a); //指针 a2->hello(); //ok A& a3 = const_cast<A&>(a); //常量 a3.hello(); //ok