隐式转换: 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:
根据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