检查对象在C ++中的哪个子类?

时间:2013-08-11 10:23:14

标签: c++ inheritance casting struct subclass

鉴于存在以下结构类型:

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

我们有一段代码:

A a = f();

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

如果需要,我可以提供我正在尝试使用此答案的上下文,但我认为不需要。

2 个答案:

答案 0 :(得分:2)

请注意,C ++中的polimorphism仅适用于指针和引用,如果按值返回A,它将始终为A.如果函数f()返回类型B的类,则会发生slicing

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

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

答案 1 :(得分:0)

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

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

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

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