c++强制转换

隐式转换: char->int
显示转换:
    c风格转换: Base* b=new Test; Test* t=(Test*)b;
    c++风格:
        static_cast: 编译时检查,如果不是派生关系,则编译错误
        dynamic_cast:运行时检查,如果不是派生关系,则返回null---rtti
        reinterpret_cast: 二进制转换,猜测等价于c风格转换


class Test1:public Base
{
public:
    ~Test1()
    {
        LOG_INFO("~test1");
    }
    void test()
    {
        LOG_INFO("test1");
    }
};

class Test2
{
public:
    Test2():a(1){}
    void test1()
    {
        a=1;
        LOG_INFO("test2, %d", a);
    }

private:
    int a;
};

int main()
{

    Base* b=new Test1();
    Test2* t=(Test2*)b;
    t->test1();
}

以上方法编译的时候不出错,运行的时候也不会中断。

总结: 不用c风格强制转换

    Base* b=new Test1();
    Test2* t=dynamic_cast<Test2*>(b);//为空
    t->test();


    Base* b=new Test1();
    Test2* t=static_cast<Test2*>(b);//运行ok,但是逻辑上有错
    t->test();


综上,只用dynamic_cast,  毕竟static_cast不安全。




///

   dynamic_cast:   通常在基类和派生类之间转换时使用;
   const_cast:  主要针对const和volatile的转换.   
   static_cast: 一般的转换,如果你不知道该用哪个,就用这个。   
   reinterpret_cast:  用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数。


根据rtti(Run-Time Type Identification,通过运行时类型识别),

static_cast 用于数值类型之间的转换,也可以用于指针之间的转换,编译的已经确定好,效率高,但须要自己保证其安全性。

dynamic_cast 用于有继承关系的类之间转换,是基于RTTI数据信息的,运行时检测,安全,但是效率低。


class A{

public:

intm_iNum;

virtual voidf(){}

};

 

class B:publicA{

};

 

class D:publicA{

};

 

voidfoo(){

B*pb = new B;

pb->m_iNum= 100;

D*pd1 = static_cast<D *>(pb); //copile error

D*pd2 = dynamic_cast<D *>(pb); //pd2is NULL

deletepb;

}


url:

http://www.cnblogs.com/zhyg6516/archive/2011/03/07/1971898.html

http://blog.sina.com.cn/s/blog_4a84e45b0100f57m.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值