首页 > 解决方案 > C ++将抽象类型的动态分配对象传递给函数并存储在向量中

问题描述

在调用方,我想通过流运算符传递特定超类的任意对象:

class SubclassA : public Superclass { ... }
class SubclassB : public Superclass { ... } 

...

Container container;
container << SubclassA(param1, param2) << SubclassB(param);

在被调用方,我必须将所有传递的对象存储在向量或列表中:

std::vector<std::unique_ptr<Superclass>> childs;
Container & operator<<(Superclass const & child) {
  childs.emplace_back(new Superclass(child)); // not possible, since Superclass is abstract 
  return *this;
}

有没有可能在被调用方保持所需的行为,避免需要std::unique_ptrornew关键字?

编辑&:在流运算符参数中添加缺失。

标签: c++vectorabstract-classdynamic-memory-allocationunique-ptr

解决方案


您需要添加两件事才能完成这项工作。

首先,operator<< 需要通过引用来获取它的参数。否则你有对象切片

其次,您需要添加一个由所有派生类实现的虚拟clone方法。Superclass此方法将复制自身并返回指向它的指针。

class Superclass {
public:
    virtual Superclass *clone() const;  // optionally can be abstract
    // ...
};

Container & operator<<(Superclass const &child) {
  childs.emplace_back(child.clone());
  return *this;
}

class SubclassA : public Superclass {
    SubclassA *clone() const override {
        return new SubclassA(*this);
    }
};

这依赖于从指针创建 unique_ptrs。由于这些天不鼓励使用任何类型的原始指针,请参阅此答案以克服智能指针和协变返回类型无法unique_ptr直接使用和使用的限制。


推荐阅读