向上转型:指用派生类指针指向基类对象
向下转型:指将基类指针指向派生类对象
向下转型不会有任何问题,而向上转型默认情况下是不允许的
如果你一定要向上转型,可以“勉强”使用强制类型转换,强制转换为派生类,但是这样做是很有问题的。
dynamic_cast操作符
向上转型是不安全的,不建议这样做。当继承关系比较复杂,或者搞不清继承关系时,可以使用 dynamic_cast 操作符来保证转型的安全。
dynamic_cast 只允许向下转型,而不允许向上转型。dynamic_cast 只能用在多态中(也就是有虚函数的类),因为它要遍历继承链,确定两个类的“父子关系“。
请看下面的例子:
#include
using namespace std;
class A{
public:
virtual void display(){ cout<<"A::display()"<
};
class B: public A{
public:
void display(){ cout<<"B::display()"<
};
int main(){
B *p1 = dynamic_cast(new A);
if(p1){
p1->display();
}else{
cout<<"Base to Derived is error!"<
}
A *p2 = dynamic_cast(new B);
if(p2){
p2->display();
}else{
cout<<"Base to Derived is error!"<
}
return 0;
}
运行结果:
Base to Derived is error!
B::display()
dynamic_cast 的使用语法为:
dynamic_cast<目标类型>(变量或表达式);
目标类型只能是指针或引用,下面的用法是错误的:
B obj;
dynamic_cast(obj);
dynamic_cast 转换成功后会返回对象的指针或引用,失败则返回 null,所以可以通过 if 来判断是否转型成功。
读者注意:dynamic_cast 的内部实现要依赖于 RTTI,并且会通过 for 循环来遍历继承链,非常低效,能不用则不用。