C++四种类型转换
const_cast
去除常性 将常量指针转化为非常量指针
举例
const int a =10;
//int p=&a; 错误 不能从const int 转换为int*
int* p=const_cast<int*>(&a);
static_cast
最常用的类型转换 安全性高
reinterpret_cast
作指针类型的转换
dynamic_cast
RTTI信息 运行时转换
举例
class Bird
{
public:
Bird(string name):mname(name)
{
}
virtual void Fly()=0;
protected:
string mname;
};
class Eagle:public Bird
{
public:
Eagle(string name):Bird(name)
{}
void Fly()
{
cout<<mname<<" can fly 1000m"<<endl;
}
};
class Chicken:public Bird
{
public:
Chicken(string name):Bird(name){}
void Fly()
{
cout<<mname<<" can fly 0m"<<endl;
}
};
//template<typename BIRD>
//void Show(BIRD *pb)
//{
// pb->Fly();
//}
//void Show(Bird *pb)
//{
// if(typeid(*pb)==typeid(Chicken))
// {
// cout<<"Chicken can not fly"<<endl;
// }
// else
// {
// pb->Fly();
// }
//}
//dynamic_cast
void Show(Bird *pb)
{
Chicken *pc=dynamic_cast<Chicken*>(pb);
if(pc!=NULL)
{
cout<<"Chicken can not fly"<<endl;
}
else
{
pb->Fly();
}
}
int main()
{
Eagle* pe=new Eagle("eagle");
Chicken* pc=new Chicken("chicken");
Show(pe);
Show(pc);
return 0;
}
此例中打印一个抽象类(含有纯虚函数的类)派生出的派生类中的方法采用了模板、比对派生类名称以及采用dynamic_cast的方法。
Chicken pc=dynamic_cast<Chicken>(pb);
dynamic类型转换流程:首先通过pb这个Bird*基类指针找到对应的对象,在对象中找到虚函数指针,对虚函数指针解引用找到虚表并拿到RTTI信息,将RTTI信息与要转换的类型信息Chicken比对。如果相同则允许转换,即pc被允许指向chicken对象;如果不相同,则pc指向NULL。