我在wikipedia上浏览了 RTTI 的示例。
我对这部分感到困惑
abc *abc_pointer = 新 xyz();
如果让 abc_pointer 指向一个 xyz 对象,那么它会被识别出来是不是很明显。我的意思是比较有什么用
xyz_pointer != NULL
后来和RTTI一般呢?我在这里错过了什么吗?
重要的是当他们这样做时:
xyz_pointer = dynamic_cast<xyz*>(abc_pointer);
稍后将其转换回xyz
. 不是所有abc
的 s 都会是xyz
s,即使所有xyz
的 s 都是abc
s。这里dynamic_cast
说“如果它是其中之一,那就投它,否则停下来给我NULL
而不是做坏事”。dynamic_cast
正在为您使用 RTTI。
在玩具示例中,您可以清楚地告诉(如果编译器愿意的话,编译器甚至可以弄清楚) thatabc*
也是xyz*
。想象一下这个功能:
void (abc *ptr) {
if (dynamic_cast<xyz*>(ptr)) {
//...
}
else {
//...
}
}
在那种一般情况下,如果不在运行时查看其类型信息,就无法判断您给出的内容是否可以转换为 a xyz
,这正是这样dynamic_cast
做的。
请注意,如果您使用static_cast<xyz*>(ptr)
演员表总是看起来有效,即使在这样做实际上不合法并且很可能导致未定义的行为的情况下也是如此。
在这里应该注意的是,如果你发现自己写了很多if (dynamic_cast<...
可能表明“代码味道”的东西 - 你应该考虑重构,可能虚拟方法会更合适。dynamic_cast
在设计 C++ 时,RTTI 应该是最后的手段。