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

时间:2016-06-17 18:14:00

标签: c++ inheritance copy-constructor

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

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成员函数中不起作用。此外,我认为我仍然必须显式覆盖每个派生类中的create_copy()方法,因为在编译时计算了decltype(* this),因此将该代码放入基类方法对我没有任何帮助。

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

1 个答案:

答案 0 :(得分:2)

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

这称为CRTP,被广泛使用。请注意,您可能需要在BaseImplCopy中使用static_cast(this)。

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