1.const_cast
用于强制去除不能被修改的常量属性,即去掉类型的const和volatile属性。去除常量性的对象必须为指针或引用。
用法:const_cast<type_id>(expression)
const int a = 10;
int* p = const_cast<int*>(&a);
最终转换的类型放在<>中,可以转换,则运行成功,不能转换,则报语法错误。
2.static_cast
用于无条件转换,静态类型转换。安全性更高。
double a = 10.0;
int* p = static_cast<int*>(&a);//报错
如果可以转换成功,说明没有安全隐患。
3.reinterpret_cast
仅重新解释类型,但没有进行二进制的转换。类似C转换,转换的类型必须是一个指针。最普通的用途就是在函数指针类型之间进行转换。
用法:reinterpret_cast<type_id>(expression)
4.dynamic_cast
用于RTTI信息转换,有条件转换,动态类型转换,运行时检查类型安全,转换失败返回NULL。
用法:dynamic_cast<type_id>(expression)
#include<iostream>
#include<string>
class Bird
{
public:
Bird(std::string nm) : mname(nm){}
virtual void fly() = 0;
protected:
std::string mname;
};
class Eagle : public Bird
{
public:
Eagle(std::string name) : Bird(name){}
void fly()
{
std::cout << mname << " can fly 2000m!" << std::endl;
}
};
class Chicken : public Bird
{
public:
Chicken(std::string name) : Bird(name){}
void fly()
{
std::cout << mname << " can fly 0m!" << std::endl;
}
};
//方法一:
void ShowFly(Bird* pb)
{
Chicken* pc = dynamic_cast<Chicken*>(pb);
if (pc == NULL)
{
pb->fly();
}
else
{
std::cout << "Chicken can not fly!" << std::endl;
}
}
//方法二:
//void ShowFly(Bird* pb)
//{
// if (typeid(*pb) == typeid(Chicken))
// {
// std::cout << "this bird can not fly!" << std::endl;
// }
// else
// {
// pb->fly();
// }
//}
int main()
{
Eagle* pe = new Eagle("eagle");
Chicken* pc = new Chicken("chicken");
ShowFly(pe);
ShowFly(pc);
return 0;
}