dynamic_cast
dynamic_cast最特殊的地方在于它支持运行时
识别指针或引用
dynamic_cast主要用于“安全地向下转型”(向上转型本来就是安全的)
对于“向下转型”有两种情况:
- 一种是基类指针所指对象是派生类类型的,这种转换是安全的;
- 另一种是基类指针所指对象为基类类型,在这种情况下dynamic_cast在运行时做检查,转换失败,返回结果为0;
下面代码验证了以上两种情况:
#include "stdafx.h"
#include<iostream>
using namespace std;
class Base
{
public:
Base(){};
virtual void Show(){cout<<"This is Base calss";}
};
class Derived:public Base
{
public:
Derived(){};
void Show(){cout<<"This is Derived class";}
};
int main()
{
//这是第一种情况
Base* base = new Derived;
if(Derived *der= dynamic_cast<Derived*>(base))
{
cout<<"第一种情况转换成功"<<endl;
der->Show();
cout<<endl;
}
//这是第二种情况
Base * base1 = new Base;
if(Derived *der1 = dynamic_cast<Derived*>(base1))
{
cout<<"第二种情况转换成功"<<endl;
der1->Show();
}
else
{
cout<<"第二种情况转换失败"<<endl;
}
delete(base);
delete(base1);
system("pause");
}
运行结果:
static_cast
编译器隐式执行的任何类型转换都可以由static_cast显式完成,如char与int、int与float、enum与int之间
但是static_cast不做运行时的类型检查
。所以static_cast不如dynamic_cast安全。
对含有二义性的指针,dynamic_cast会转换失败,而static_cast却直接且粗暴地进行转换,这是非常危险的。
const_cast
主要是用来去掉const属性,当然也可以加上const属性。主要是用前者,后者很少用。
const int a = 1;
int *p;
p = const_cast<int*>(&a);
reinterpret_cast
reinterpret_cast功能十分强大,可以实现任意类型之间的转换;
但是操作十分不安全,不建议使用。