【问题标题】:How to determine actual object type at runtime in C++;如何在 C++ 中确定运行时的实际对象类型;
【发布时间】:2013-03-31 15:47:05
【问题描述】:

假设我们有一个类层次结构。在底部我们有 Base 和在顶部 Derived。 即使转换为基类指针,如何确定对象类。

Base* b = new Derived():

typeid(b).name(); // i want this to tell me that this is actually derived not base object

除了手动实现字符串字段或类似的虚拟获取功能之外,还有其他方法吗?

PS:我说的是独立于编译器的解决方案

【问题讨论】:

标签: c++ typeid typeinfo


【解决方案1】:

确保基类至少有一个虚拟方法,包括<typeinfo>,并使用您当前的代码,只需附加解引用typeid(*b).name()


顺便提一下,typeid 调用是 C++ 中可以取消引用具有明确定义行为的空指针的地方,这意味着它可以引发异常:

C++11 §5.2.8/2:
“如果通过将一元 * 运算符应用于 指针和指针是空指针值 (4.10),typeid 表达式会抛出 std::bad_typeid 异常 (18.7.3)。”

【讨论】:

  • 将析构函数作为“至少一个虚拟方法”是个好主意
【解决方案2】:

如果您只想找到b 是否真的指向Derived,只需使用dynamic_cast()

if (dynamic_cast<Derived*>(b)) { ... }

如果b 指向的对象的实际运行时类型不是Derived(或从Derived 派生的类),dynamic_cast 返回一个空指针。与std::type_infoname() 成员不同,这是编译器不变的。

请注意,这仅在Base 具有至少一个虚拟成员函数时才有效。无论如何它都应该这样做,因为你是通过基指针操作从它派生的类型,所以它应该有一个虚拟析构函数。

【讨论】:

  • 但情况是我不想在添加新类的任何时候修改代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-17
  • 2011-04-19
  • 2010-11-02
  • 1970-01-01
  • 2010-11-16
  • 2012-05-02
相关资源
最近更新 更多