检查对象在C++中的子类

Check which subclass an object is in C++?

本文关键字:子类 C++ 对象 检查      更新时间:2023-10-16

假设有以下结构类型:

struct A {};
struct B : A {};
struct C : A {};
struct D : B {};

我们有一段代码:

A a = f();

如何检查结构的实际类型?即是ABC还是D

如果需要的话,我可以给出我试图使用答案的背景,但我认为这不是必要的。

请注意,C++中的多态性仅适用于指针和引用,如果按值返回A,则它将始终是A。如果函数f()返回类型为B的类,则将发生切片。

如果更改函数以返回指向a的指针,则可以使用动态强制转换并检查是否返回null。

A *a=f();
B *b=dynamic_cast<B*>(a);
if(b!=NULL)
{
    //a was of type B
}

类型为A。为什么?因为切片。

但是,如果f()返回A&,而您使用A& a = f();,那么您有两个选项(都涉及RTTI):

  1. 您可以使用typeid(a)并查看其name()或与各种(子)类的type_info对象进行比较。

  2. 您可以使用dynamic_cast:例如,如果a的类型不是D,则dynamic_cast<D*>(&a)将返回null。