4.5dynamic_cast操作符

向上转型:指用派生类指针指向基类对象

向下转型:指将基类指针指向派生类对象

向下转型不会有任何问题,而向上转型默认情况下是不允许的

如果你一定要向上转型,可以“勉强”使用强制类型转换,强制转换为派生类,但是这样做是很有问题的。

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 循环来遍历继承链,非常低效,能不用则不用。

你可能感兴趣的:(4.5dynamic_cast操作符)