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

时间:2014-04-01 15:00:07

标签: c++ inheritance collections polymorphism stdvector

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

以下是一个示例代码:

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>();

感谢您的一切。

3 个答案:

答案 0 :(得分:2)

由于object slicing problem,您无法对象执行此操作。您需要使用指针 - 最好是智能指针,例如unique_ptr<Parent>

GenericCollection<unique_ptr<Parent>> collection;    

现在,您可以实现getElements方法,该方法使用Run-Time Type Information (RTTI)来检测智能指针所指向的对象的类型,并仅保留指向Child2的对象的类型。

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

答案 1 :(得分:1)

在C ++中,你无法直接做你所要求的事情,因为项目在矢量中“按值”存储,所以你只会得到每个对象的父部分,而特定于孩子的部分将会切掉。

但是我们可以能够解决您的真正问题。

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

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

答案 2 :(得分:0)

在这种情况下,你不能。有关详细信息,请参阅object slicing

只有拥有指针集合才能生效。为此,我建议您阅读std::unique_ptr