15.4
15.4 RTTI
RTTI是运行阶段类型识别(Runtime Type Identification)的简称。
这是新添加到C++中的特性之一, 很多老实现先不支持。
RTTI旨在为程序再运行阶段确定对象的类型提供一种标准的方式。
创建一种RTTI语言标准将使得未来的各种厂商的库可以彼此兼容。
RTTI用途
C++有三个支持RTTI的元素。
1.dynamic_cast运算符将使用一个指向基类的指针来生成一个指向派生类的指针;否则, 该运算符返回0——空指针。
2.typeid运算符返回一个指出对象类型的值。
3.type_info结构储存了有关特定类型的信息。
只能将RTTI用于包含虚函数的类层次结构, 原因在于只有对于这种类层次结构, 才应该将派生类对象的地址赋给基类指针。
dynamic_cast运算符
它不能回答指针指向的是那类对象, 但能回答是否可以安全地将对象的地址赋给特定类型的指针。
语法:
dynamic_cast[InvalidCharacterError: "*" did not match the Name production]
Superb * pm = dynamic_cast[InvalidCharacterError: "*" did not match the Name production]
P646-注意:即使片一起支持RTTI, 在默认情况下, 他也可能关闭该特性。如果该特性被关闭, 程序可能仍通过编译, 但将出现运行阶段错误。 在这种情况下, 您应查看文档或菜单选项。
应尽可能使用虚函数, 而只在必要时使用RTTI。
也可以将dynamic_cast用于引用, 用法稍微不同:没有与空指针对应的引用值, 因此无法使用特殊的引用之来指示失败。当请求不正确时, dynamic_cast将引发bad_cast异常, 从exception派生而来, 头文件::
#include
...
try
{
Surperb & rs = dynamic_cast[InvalidCharacterError: "&" did not match the Name production]
...
}
catch (bad_cast &)
{
...
}; // 此处应该没有分号P646
typeid运算符和type_info类
typeid运算符能够确定两个对象是否为同类型, 他与sizeof有些像, 可以接受两种参数:
类名、结果为对象的表达式。
返回值:返回一个对type_info对象的引用, type_info在头文件中。
type_info重载了 == 和 != 运算符, 以便可以使用这些运算符来对类型进行比较。
typeid(Magnificent) == typeid(*pg)
如果pg是一个空指针, 则引发bad_typeid异常, 从exception中派生而来。头文件:
type_info随厂商而异, 包含name()成员, 该函数返回一个随实现而异的字符串:通常是类的名称。
误用RTTI的例子
提示:如果发现在扩展的if else语句系列中使用了typeid, 则应考虑是否应该使用虚函数和dynamic_cast。