将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的向量复制到抽象基的派生类中。的主要内容,如果未能解决你的问题,请参考以下文章