如何为派生类实现复制构造函数

How to generically implement copy constructor for derived classes?

本文关键字:实现 复制 构造函数 派生      更新时间:2023-10-16

我想在以下类A上实现复制构造函数,其中包含指向多态性实现类的指针。目前,我在类基础中有一个virtual 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()方法,因为在编译时评估了dectType(*this),因此将该代码放入基类方法中不会对我有任何好处。p>编辑:奇怪地重复的模板模式多态副本(C )的遗传答案比我需要的要复杂。我很简单深度1的继承层次结构绝对不需要扩展到更大的深度。Iorro的答案以及提供的链接足以解决我的问题。

  • 有一个中间的碱基图模板类
  • t in It t in exeral create_copy()
  • 使其源于基础
  • 让得出源自碱基的衍生

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

btw,create_copy()通常称为clone()。