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