C++ dynamic_cast, static_cast, reinterpret_cast 我的简单理解
static_cast:
一般用来做类型强转. 类似以下, 转换有编译器的一个验证.
double db = 1;
int ia = (int)db;
int ia2 = static_cast<int>(db);
dynamic_cast:
一般用来做上下级的转换, . 编译器不检查, 运行出错返回指针为0。在vs2010中有拼写检查, 要求必须是多态继承的, 要不然会出现下面的错.
IntelliSense: the operand of a runtime dynamic_cast must have a polymorphic class type
所以比之前要安全多了. 减少了很多类似 if(ptr_ret) goto: bad_convertion 之类的代码, 但目前也不能说100%保证转换成功. 多写一行没事.
基类* b_ptr = new 子类();
子类* c_ptr = dynamic_cast<子类*>(b_ptr); //向下
基类* b_ptr1 = new 基类();
子类* c_ptr1 = dynamic_cast<子类*>(b_ptr1); //错误, 结果可能是0 INVALID_HANDLE_VALUE, vs2010中是报拼写错误, 不能编译
一个错误的例子:
class A:public base1 {virtual void f(){}};
class B:public base1 {virtual void f(){}};
class C:public A, public B
{
void f(){}
};
B* b = new B();
A* a = dynamic_cast<A*>(b); //转换失败
reinterpret_cast:
一般把一个类型转换为指针或其他类型. 结果不预期, 主要是为了类型兼容而不报错. 不建议直接使用转换后的类型. 比如下面:
class base1
{
public:
void cw() const
{
cout<<"base class"<<endl;
}
};
class init:public base1
{
public:
void cw() const
{
cout<<"init class cw fist"<<endl;
base1::cw();
}
};
......
base1* i1 = new base1();
init* b1 = reinterpret_cast<init*>(i1);
b1->cw(); //结果是什么? (关联到了虚函数表定义) 不一定会到基类的那个方法中去.
有点类似.net的"拆箱装箱", 但是不同的是, 使用的时候如果装在箱容器以后, 必须拆箱再用. 可能我只想把 function call() 转换成一个 void*.