C++ C++;具有抽象类指针的对象的副本

C++ C++;具有抽象类指针的对象的副本,c++,pointers,abstract-class,copy-constructor,C++,Pointers,Abstract Class,Copy Constructor,考虑Container类,它基本上存储Box对象的unique_ptrs向量,并可以对它们执行一些计算 class Container { private: std::vector<std::unique_ptr<Box> > boxes_; public: Container(std::vector<std::unique_ptr<Box> > &&boxes): boxes_(std::move(boxe

考虑
Container
类,它基本上存储
Box
对象的
unique_ptr
s向量,并可以对它们执行一些计算

class Container
{
  private:
    std::vector<std::unique_ptr<Box> > boxes_;
  public:
    Container(std::vector<std::unique_ptr<Box> > &&boxes): boxes_(std::move(boxes)){}
    double TotalVolume() { /* Iterate over this->boxes_ and sum */ }
};

如何复制
c
?我想要一个函数来复制
Box
中的底层
Box
对象,但我认为基类很难做到这一点。

制作副本的一种方法是在基类中有一个“Copy”虚拟方法。此方法将创建当前对象的副本并返回指向该对象的(唯一)指针。如果类中有任何包含的指针,它们也需要创建新的副本(深度副本)


还有其他办法。例如,您可以测试向量中的每个对象以确定其类型(使用
dynamic\u cast
),但这是丑陋的、低效的,而且非常容易出错。

无论如何,为什么不使用std::vector?谢谢:tor已更改。至于不使用
向量
容器
,实际上是某个基类的派生类,具有虚拟的
总体积
方法。我最初的问题不是盒子和容器,而是一些我正在尝试扩展的复杂项目。这实际上对我的情况非常有效。此设计模式是否有名称(使用
unique\u ptr
s复制方法)?@Salmonstrikes:常用名称是克隆函数。其中一位老古人称之为虚拟构造函数,但该术语是在ISO C++ + FAQ(或至少是在原始C++ FAQ)中的,它很少使用,如果使用过的话。甚至有一些测试问卷用来测试你的C++知识,它询问为什么C++中没有虚拟构造函数,从而暴露出作者缺乏知识(一次它是一个阅读者使用的术语)和作者缺乏推理能力(几乎任何事物都可以在设计语言时给出一个意义)。
std::vector<std::unique_ptr<Box> > x;
x.push_back(std::move(std::unique_ptr<Box>(new SquareBox(1.0)));
x.push_back(std::move(std::unique_ptr<Box>(new RectangularBox(1.0, 2.0, 3.0)));
Container c(x);