参考: c++ primer
1.dynamic_cast
如果启动了支持运行时间类型信息(RTTI),dynamic_cast可以有助于判断在运行时所指向对象的确切类型。可以基于类的指针指向许多不同的子类型,然后将被转型为基础类的对象还原成原来的类。
正确使用:
#include <iostream>
using namespace std;
class Person{
public:
void show(){
cout << "Person" << endl;
}
};
class Male:public Person{
public:
void show()
{
cout << "Male" << endl;
}
};
int main()
{
Male *male = new Male();
//
Person p = dynamic_cast<Person*>(male);
p->show();
return 0;
}
#include <iostream>
using namespace std;
class Person{
public:
virtual void show(){
cout << "Person" << endl;
}
};
class Male:public Person{
public:
int a;
/*
void show()
{
cout << "Male" << endl;
}*/
};
int main()
{
Person *person = new Person();
Male *male = dynamic_cast<Male*>(person);
//此时由于从基类转为派生类,此时派生类中有int a,导致内存不一致,所以无法进行强制转换。如果去掉int a则正确运行
//若Person *person = new Male()正确。因为动态绑定,该指针指向派生类继承父类的那部分。
if(!male){
cout << "fail" <<endl;
}
male->show();
return 0;
}
2.static_cast
任何类型的强制转换都可以由static_cast显示完成
3.const_cast
去掉const性质
4. reinterpret_cast
通常为操作数的位模式提供较低层次的重新解释。
为了安全使用reinterpret_cast要求程序员完全理解所涉及的数据类型,以及编译器实现强制类型转换的细节。