如何在c++运行时确定实际的对象类型;

How to determine actual object type at runtime in C++;

本文关键字:对象 类型 c++ 运行时      更新时间:2023-10-16

假设我们有一个类层次结构。底部是基础,顶部是派生。如何确定对象类,即使它被转换为基类指针。

Base* b = new Derived():
typeid(b).name(); // i want this to tell me that this is actually derived not base object

除了手动实现字符串字段或虚拟get函数之外,还有其他方法吗?

PS:我说的是与编译器无关的解决方案

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


顺便说一句,请注意typeid调用是c++中唯一一个可以解引用具有良好定义行为的空指针的地方,这意味着它可以抛出异常:

c++ 11§5.2.8/2 :
如果对a应用一元*运算符得到左值表达式如果指针是空指针值(4.10),则typeid表达式抛出std::bad_typeid异常(18.7.3)。”

如果您想要做的是找出b是否实际上指向Derived,只需使用dynamic_cast():

if (dynamic_cast<Derived*>(b)) { ... }
如果b所指向的对象的实际运行时类型不是Derived(或从Derived派生的类),则

dynamic_cast返回空指针。与std::type_infoname()成员不同,这是编译器不变量。

注意,这只适用于Base至少有一个虚成员函数的情况。无论如何,它应该这样做,因为您是通过基指针操作从它派生的类型,所以它应该有一个虚析构函数。