dynamic_cast
是与static_cast
,const_cast
,reinterpret_cast
并列的4种类型转换操作之一。它可以将基类的指针显示转换为派生类的指针,或将基类的引用显示转换为派生类的引用。但与static_cast
不同的是,它执行的不是无条件的转换,它在转换前会检查指针(或引用)所指向对象的实际类型是否与转换的目的类型兼容,如果兼容转换才会发生,才能得到派生类的指针(或引用),否则:
- 如果执行的是指针类型的转换,会得到空指针。
- 如果执行的是引用类型的转换,会抛出异常。
#include <iostream>
using namespace std;
class Base{
public:
virtual void fun1(){
cout << "Base::fun1()" << endl;
}
virtual ~Base(){}
};
class Derived1 : public Base{
public:
virtual void fun1(){
cout << "Derived1::fun1()" << endl;
}
virtual void fun2(){
cout << "Derived1::fun2()" << endl;
}
};
class Derived2 : public Derived1{
public:
virtual void fun1(){
cout << "Derived2::fun1()" << endl;
}
virtual void fun2(){
cout << "Derived2::fun2()" << endl;
}
};
void fun(Base * b){
b -> fun1();
Derived1 * d = dynamic_cast<Derived1*> (b); // 尝试将 b 转换为 Derived1 指针
if (d!=0) { // 判断转换是否成功
d -> fun2();
}
}
int main(){
Base *base = new Base();
fun(base);
Derived1 *derived1 = new Derived1();
fun(derived1); // derived1 是 Derived1 类型的对象,对指向 derived1 的指针执行转换,成功得到 Derived1 类型的指针
Derived2 *derived2 = new Derived2();
fun(derived2); // Derived2 是 Derived1 的派生类,对指向 Derived2的指针执行转换,也能够成功得到 Derived1 类型的指针
delete derived2;
delete derived1;
return 0;
}
注:
转换前类型必须是指向多态类型的指针,或多态类型的引用,而不能是指向非多态类型的指针或非多态类型的引用,这是因为C++只为多态类型在运行时保存用于运行时类型识别的信息。