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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将shared_ptr的向量复制到抽象基的派生类中。相关的知识,希望对你有一定的参考价值。

我试图将派生类的对象实例从一个 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));
    }
};

以上是关于将shared_ptr的向量复制到抽象基的派生类中。的主要内容,如果未能解决你的问题,请参考以下文章

抽象类的 shared_ptr 向量到副本向量

复制从抽象类派生的对象

将项目从一个向量复制到另一个向量

使用shared_ptr将基类引用值复制到映射

将派生类中的对象插入到所述对象的另一个实例中(使用 vector.insert 函数)C++

识别已将哪个基类 shared_ptr 传递到超类 shared_ptr 向量中