我想在父类型的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>();
感谢您的一切。
答案 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
。