我正在查看 wikipedia 上的 RTTI 示例.
我对这部分感到困惑
abc *abc_pointer = new xyz();
如果 abc_pointer 被设置为指向 xyz 对象,那么很明显它会被识别。我的意思是比较有什么用
xyz_pointer!= NULL
后来和RTTI 的总体情况如何呢?我在这里遗漏了什么吗?
最佳答案
重要的是他们什么时候这样做:
xyz_pointer = dynamic_cast<xyz*>(abc_pointer);
稍后将其转换回 xyz
。并非全部abc
s 将是 xyz
s,尽管所有 xyz
是 abc
s。这里是dynamic_cast
说“如果是其中之一,则将其转换,否则停止并给我 NULL
而不是做坏事”。 dynamic_cast
正在为您使用 RTTI。
在玩具示例中,您可以清楚地告诉(编译器甚至可以根据需要计算出) abc*
是 xyz*
也。想象一下这个功能:
void (abc *ptr) {
if (dynamic_cast<xyz*>(ptr)) {
//...
}
else {
//...
}
}
在一般情况下,无法判断您所提供的内容是否可以转换为 xyz
无需在运行时查看其类型信息,这正是dynamic_cast
确实如此。
请注意,您是否使用过 static_cast<xyz*>(ptr)
即使在实际上这样做不合法并且很可能导致未定义行为的情况下,强制转换看起来总是有效的。
这里应该注意的是,如果您发现自己写了很多 if (dynamic_cast<...
这可能表明“代码味道” - 您应该考虑重构,可能虚拟方法会更合适。 dynamic_cast
RTTI 应该是设计 C++ 时的最后手段。
关于c++ - 关于维基百科上的 RTTI 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10522228/