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

C++ copies of objects with abstract class pointers

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

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 */ }
};

这里,Box是一个抽象class,它有一个纯虚方法,例如double Box::Volume()

现在,假设我在主程序中实例化一个容器为:

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);

如何制作 c 的副本?我想要一个在 boxes_ 中复制底层 Box 对象的函数,但我认为很难用基数 classes?

做到这一点

制作副本的一种方法是在基础 class 中使用 "Copy" 虚方法。此方法将创建当前对象的副本和 return 指向它的(唯一)指针。如果 class 中有任何包含的指针,它们也需要创建新副本(深层副本)。

存在其他方法。例如,您可以测试向量中的每个对象以确定其类型(使用 dynamic_cast),但这样做很丑陋、效率低下并且很容易出错。