运行时类型识别RTTI和显式转换
C++用于类型转换的4个操作符:reinterpret_cast,const_cast,static_cast,dynamic_cast。
转换形式:cast_name<type>(expression)
(1) reinterpret_cast:本质上依赖于机器,非常危险,避免使用。
(2) const_cast:改变表达式的常量属性(添加或删除const特性)。
(3) static_cast:编译器隐式执行的任何类型转换都可以有static_cast显式完成。eg:基类和派生类。
(4) dynamic_cast:用于将基类的指针和或引用安全地转换成派生类的指针或引用,涉及运行时类型检查。主要用于类层次间的类型转换,对没有虚函数的类使用dynamic_cast会导致编译错误:运行时dynamic_cast的操作数必须包含多态类型。dynamic_cast运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中,只有定义了虚函数的类才有虚函数表,所以对没有虚函数的类使用dynamic_cast会导致编译错误。dynamic_cast转换指针类型,转换成功返回目标类型,转换失败返回nullptr;dynamic_cast转换引用类型,转换成功返回目标类型,转换失败抛出bad_cast异常。
如何根据基类指针判断指针指向的子类?
Q:两个类B,C分别继承于A(类A中含有虚函数),如果一个A类指针指向了某个对象,如何判断具体指向的对象类型?
A:使用动态运行时类型识别dynamic_cast。如果指针指向的类型不是目标类型,则dynamic_cast转换失败,返回nullptr;转换成功则返回目标类型。
A *pa = new X;
if ((dynamic_cast< B* >(pa)) != nullptr)
cout << "此类X为B" << endl;
else
cout << "此类X为C" << endl;