类型检查有两种方式:编译时检查,与运行时识别,
RTTI( 运行时类型识别)C++有较强的类型检查机制,RTII机制的两个符号及typeid及dynamic_cast,
1、typeid
C++为每种类型包括基本类型与自定义类型都定义了一个type_info对象,该对象有一个name函数返回对应类型的字符串名字,typeid即返回其对象的对应type_info对象。
2、dynamic_cast
dynamic_cast是C++提供的一个对有继承关系类的指针或对象引用的一个转换函数
C++下尽量少用c的强制类型转换
写法:dynamic_cast<type-id>(expression)
其中typeif为指针或引用类型,或void*
expression为指针或是一个可用的左值
class A{};
class B: public A{};
如上继承关系,A是b的父类
B* pb = new B;
A* pa = dynamic_cast<A*>(pb);
如上就是一种“向上转换”即 upcast,这是被C++允许的,是隐式的转换。这时不会发生错误。
而要实现这种机制编译器要保存一颗树,当发生dynamic_cast是查询这棵树,发现A 与B 是一种is a的关系,因此转换成功。
A* pa = new B;
B *pb = dynamic_cast<B*>(pa);
上面的转换时一种“向下转换” downcast
这时转换是否成功取决于pa是否为B 类型的指针。上面转换时正确的。
而
A* pb = new A;
B* pa = dynamic_cast<B*>(pb);
因pb不是指向B的指针因此转换失败。
转换失败如果是指针则pa = NULL,如果是引用则抛出std::bad_cast异常。