我在wikipedia点击了RTTI的例子。
我对这部分感到困惑
abc * abc_pointer = new xyz();
如果abc_pointer指向xyz对象,那么很明显它会被识别出来。我的意思是比较的用途是什么
xyz_pointer!= NULL
以后和RTTI一般呢?我在这里错过了什么吗?
答案 0 :(得分:4)
重要的是他们这样做:
xyz_pointer = dynamic_cast<xyz*>(abc_pointer);
稍后将其转回xyz
。并非所有abc
都是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<...
- 你应该考虑重构,可能虚拟方法更合适。在设计C ++时,dynamic_cast
和RTTI应该是最后的手段。