15.4.2 RTTI的工作原理(4)
程序清单15.18所示程序的运行情况如下:
与前一个程序的输出一样,每次运行该程序的输出都可能不同,因为它使用rand( )来选择类型。另外,调用name()时,有些编译器可能提供不同的输出,如5Grand(而不是Grand)。
3.误用RTTI的例子
C++(www.cppentry.com)界有很多人对RTTI口诛笔伐,他们认为RTTI是多余的,是导致程序效率低下和糟糕编程(www.cppentry.com)方式的罪魁祸首。这里不讨论对RTTI的争论,而介绍一下应避免的编程(www.cppentry.com)方式。
请看程序清单15.17的核心代码:
通过放弃dynamic_cast和虚函数,而使用typeid,可以将上述代码重新编写为:
上述代码不仅比原来的更难看、更长,而且显式地指定各个类存在严重的缺陷。例如,假设您发现必须从Magnificent类派生一个Insufferable类,而后者需要重新定义Speak( )和Say( )。使用typeid来显示地测试每个类型时,必须修改for循环的代码,添加一个else if,但无需修改原来的版本。下面的语句适用于所有从Grand派生而来的类:
而下面的语句适用于所有从Superb派生而来的类:
提示:如果发现在扩展的if else语句系列中使用了typeid,则应考虑是否应该使用虚函数和dynamic_cast。