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*. 

posted on 2010-05-03 00:15  无法显示此网页  阅读(682)  评论(0编辑  收藏  举报

导航