如果我有一个超类类型的集合,如何获取特定子类类型的所有项目
If I have a collection of superclass type, how do I get all the items of a specific subclass type?
我想在 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
的信息。
相关文章:
- 如何获取std::result_of函数的返回类型
- 有没有办法通过使用十进制 ASCII 代码自动类型扣除来获取字符?
- 如何获取C++字符数据类型的地址
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 如何在没有实例的情况下获取非静态方法的类型?
- 获取 OID(类型::b_oid)作为 MongoDB C++驱动程序中的字符串
- 数组中不同类型的对象并获取每个对象的类型
- 获取可变参数模板参数包的相关类型
- 我可以使用 decltype() 或其他东西通过指针获取真实类型吗?
- 从组件的 std::type_index 获取派生最多的类型
- 在 std::variant 中按类型获取索引
- Cython:如何从C级类型获取'actual Python type'(类型代码/dtype)
- 根据参数类型获取匹配过载
- 编译按映射类型获取元素的映射错误元组
- 将 lambda 参数类型获取到模板参数包中
- 按类型获取元组元素(pre C++0x)
- std::array<T,N> 需要以另一种类型获取
- std::tuple,按继承类型获取项
- Boost变体:根据其类型获取对变体的引用
- 从双精度数据类型获取特定整数的方法