将shared_ptr的向量复制到抽象基的派生类

Copy vector of shared_ptr to derived classes of abstract base

本文关键字:抽象 派生 向量 shared ptr 复制      更新时间:2023-10-16

我正在尝试将派生类的对象实例从vector<shared_ptr<base>>复制到基类抽象的新vector<shared_ptr<base>>。我希望新vector包含对象副本的shared_ptr,而不是原始对象。

我试过这个:

class base
{
public:
base(){}
virtual void method() = 0;
};
class derived1 : public base
{
public:
derived1() : base() { };
void method() {};
};
class derived2 : public base
{
public:
derived2() : base() { };
void method() {};
};
int main()
{
std::vector<std::shared_ptr<base>> vector1 =
{
std::make_shared<derived1>(),
std::make_shared<derived2>()
};
std::vector<std::shared_ptr<base>> vector2;
vector2.reserve(vector1.size());
for (const auto& e : vector1)
{
vector2.push_back(std::make_shared<base>(*e));
}
}

这是行不通的,因为我无法实例化基类。我怎样才能正确地做到这一点?

解决此问题的一种方法是在返回指针的基类上创建一个纯虚拟克隆方法 - 子类覆盖它以分配自己的副本。

class base
{
public:
virtual std::shared_ptr<base> clone() const = 0;
};
class derived1 : public base
{
public:
virtual std::shared_ptr<base> clone() const override
{
return std::shared_ptr<base>(new derived1(*this));
}
};