c++ - 关于维基百科上的 RTTI 定义

标签 c++ rtti

我正在查看 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,尽管所有 xyzabc 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/

相关文章:

C++ FAQ Lite Smart_Ptr 类无法运行?

c++ - 如何根据其值的属性对 map 进行排序?

delphi - RTTI.TRttiIndexedProperty 向后移植到 Delphi XE

delphi - TRttiMethod.Invoke 函数在重载方法中不起作用?

delphi - 对于静态数组,使用 RTTI 获取记录字段类型失败

delphi - 你能找到一个使用RTTI的实际应用程序TStringList吗

c++ - 如何在 MPI 中使用多维 STL vector

使用 64 位变量的 C++ 尾递归

c++ - memcmp 排序

c++ - dynamic_cast 的性能