static_cast dynamic_cast const_cast reinterpret_cast
1、static_cast
可以把static_cast看做一个强制转换的操作。没有什么好说的。
2、dynamic_cast
类的继承关系图:【A为基类】
void f(D* pd)
{
E* pe = dynamic_cast<E*>(pd); // 由D-->E的转换
B* pb = pe; // 向上转换,隐式转换
A* pa = pb; // 向上转换,隐式转换
}
还存在一种交叉转换,如 D --->B 的转换。。。,这在static_cast是不可能执行的转换的。
如下面的代码:
View Code
1 #include <iostream> 2 using namespace std; 3 4 class B 5 { 6 /*public: 7 virtual void fun () 8 {}*/ 9 }; 10 11 class C 12 { 13 public: 14 virtual void fun () 15 {} 16 }; 17 18 class D : public B, public C 19 { 20 21 }; 22 23 void main() 24 { 25 B *pb = new B; 26 C *pc = new C; 27 28 /* B *pb2 = static_cast<B*>(pc); // 会报错... 29 if(pb2 == NULL) 30 { 31 cout << "转换错误" << endl; 32 } 33 */ 34 B *pb3 = dynamic_cast<B*>(pc); 35 if(pb3 == NULL) 36 { 37 cout << "转换错误" << endl; 38 } 39 }
注:dynamic_cast还存在一个动态检测的功能,如果没有正确转换,dynamic_cast返回的是NULL。