鉴于存在以下结构类型:
struct A {};
struct B : A {};
struct C : A {};
struct D : B {};
我们有一段代码:
A a = f();
您如何检查结构实际是什么类型?即是A
,B
,C
还是D
?
如果需要,我可以提供我正在尝试使用此答案的上下文,但我认为不需要。
答案 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):
您可以使用typeid(a)
并查看其name()
或与各种(子)类的type_info
对象进行比较。
您可以使用dynamic_cast
:例如,如果dynamic_cast<D*>(&a)
不属于a
类型,则D
将返回null。