如何为派生 类 通用地实现复制构造函数?

How to generically implement copy constructor for derived classes?

我想在下面的 class A 上实现一个复制构造函数,它包含一个指向多态实现 class Base 的指针。目前,我在 class Base 中有一个虚拟 create_copy() 方法,派生的 classes 需要重写。但是,派生的 classes 的覆盖都使用完全相同的代码。我是否缺少一种更简单的方法来复制 A 类型的对象?我真的需要为每个派生的 class 复制完全相同的代码吗?以下是我现在正在使用的。如果它改变了答案,则需要运行时多态性。

class A {
 public:
  A(const A& a): base_p {a.base_p->create_copy()} {}
 private:
  unique_ptr<Base> base_p;
};

class Base {
 public:
  virtual unique_ptr<Base> create_copy() const;
};

class Derived : public Base {
 public:
  unique_ptr<Base> create_copy() const override {
   return make_unique<Derived>(*this);
  }
};

我曾使用一些代码参与其中的一个想法:

return make_unique<remove_reference_t<decltype(*this)>>(*this);

但是,此代码在 const 成员函数中不起作用。另外我认为我仍然必须在每个派生 class 中显式覆盖 create_copy() 方法,因为 decltype(*this) 是在编译时评估的,因此将该代码放入基础 class 方法对我没有任何好处。

编辑: Inheritance in curiously recurring template pattern polymorphic copy (C++) 处的答案比我需要的更复杂。我有一个简单的 深度为 1 的继承层次结构,永远不需要扩展到更深的层次。 Iorro 的回答以及提供的 link 足以解决我的问题。

  • 有一个中级 BaseImplCopy 模板 class
  • 为其中的 T 实现 create_copy()
  • 使其派生自 Base
  • 让 Derived 从 BaseImplCopy 派生

这叫做CRTP,被广泛使用。请注意,您可能需要 static_cast(this) in BaseImplCopy.

顺便说一句,create_copy() 通常称为 clone()。