检查对象在C++中的子类
Check which subclass an object is in C++?
假设有以下结构类型:
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
:例如,如果a
的类型不是D
,则dynamic_cast<D*>(&a)
将返回null。
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何在C++子类中访问父类的私有变量
- 将父类的子类的数据复制到具有相同父类的另一个类