关于维基百科上的RTTI定义

时间:2012-05-09 18:45:54

标签: c++ rtti

我在wikipedia点击了RTTI的例子。

我对这部分感到困惑

  

abc * abc_pointer = new xyz();

如果abc_pointer指向xyz对象,那么很明显它会被识别出来。我的意思是比较的用途是什么

xyz_pointer!= NULL

以后和RTTI一般呢?我在这里错过了什么吗?

1 个答案:

答案 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应该是最后的手段。