如果我有一个超类类型的集合,如何获取特定子类类型的所有项目

If I have a collection of superclass type, how do I get all the items of a specific subclass type?

本文关键字:类型 获取 子类 项目 何获取 超类 有一个 集合 如果      更新时间:2023-10-16

我想在 Parent 类型的C++中创建一个集合,在其中添加不同的子类,如 Child 和 Child2,然后获取 X 子类的所有元素。我尝试使用向量,但它碰巧根据这个答案破坏了多态性。如果我使用指针集合,我将不得不按顺序迭代它,检查每个元素的类,是否有更好/更有效的解决方案?

下面是一个示例代码:

class Parent
{
   public:
     int id;
     Parent(){ id = 8; }
};
class Child: public Parent
{
     int foo;
   public:
     Child(int n){ foo= n; }
};
class Child2: public Parent
{
     int bar;
   public:
     Child2(int n){ bar= n; }
};

伪代码:

GenericCollection<Parent> collection; //Full of elements Child and Child2.

这是我想要实现的方法:

collection.getElements<Child2>();

谢谢你的一切。

由于对象切片问题,您无法对对象执行此操作。您需要改用指针 - 最好是智能指针,例如unique_ptr<Parent>

GenericCollection<unique_ptr<Parent>> collection;    

现在,您可以实现getElements方法,该方法使用运行时类型信息 (RTTI) 来检测智能指针指向的对象类型,并仅保留指向Child2的对象。

请注意,为了使用 RTTI,您的基类Parent至少需要一个虚拟成员函数。这在你的情况下应该不是问题,因为你期望多态行为。

在C++中,你不能直接做你所要求的,因为项目是"按值"存储在向量中的,所以你最终只会得到每个对象的父部分,而子特定的部分将被切掉。

但是,我们也许能够解决您的实际问题。

如果您确实需要能够生成 child1 和 child2 对象的单独列表,则C++习惯用法将是包含每种不同类型的单独向量。

但是,如果你只需要多态性,那么你可以有一个指向基类的(智能)指针向量,并对这些指针进行操作。如果你采用这种方法,不要试图获取特定子对象的列表,而是利用适当的抽象接口来执行你的逻辑。

在这种情况下,

你不能。有关详细信息,请阅读对象切片。

仅当您拥有指针集合时,它才有效。为此,我建议您阅读有关std::unique_ptr的信息。