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

Sal*_*kes 4 c++ abstract-class pointers copy-constructor

考虑这个Container类,它基本上存储了一个由unique_ptrs 个Box对象组成的向量,并且可以对它们执行一些计算。

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 */ }
};
Run Code Online (Sandbox Code Playgroud)

这里,Box是一个抽象类,它有一个纯虚方法,例如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);
Run Code Online (Sandbox Code Playgroud)

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

120*_*arm 5

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

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