【问题标题】:If I have a collection of superclass type, how do I get all the items of a specific subclass type?如果我有一个超类类型的集合,我如何获取特定子类类型的所有项目?
【发布时间】:2014-04-01 15:00:06
【问题描述】:

我想在 C++ 中创建一个 Parent 类型的集合,在其中添加不同的子类,例如 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>();

感谢一切。

【问题讨论】:

    标签: c++ inheritance collections polymorphism stdvector


    【解决方案1】:

    由于object slicing problem,您不能对对象执行此操作。您需要改用指针——最好是智能指针,例如unique_ptr&lt;Parent&gt;

    GenericCollection<unique_ptr<Parent>> collection;    
    

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

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

    【讨论】:

      【解决方案2】:

      在 C++ 中,您不能直接执行您所要求的操作,因为项目是“按值”存储在向量中的,因此您最终只会得到每个对象的父部分,而子特定部分将被切掉。

      但是我们可能能够解决您的实际问题。

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

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

      【讨论】:

        【解决方案3】:

        在这种情况下你不能。阅读object slicing了解更多信息。

        只有当你有一个指针集合时它才会起作用。为此,我建议您阅读std::unique_ptr

        【讨论】:

          猜你喜欢
          • 2021-08-24
          • 2013-02-19
          • 1970-01-01
          • 2010-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多