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

C++ 如何为派生类通用地实现复制构造函数?,c++,inheritance,copy-constructor,C++,Inheritance,Copy Constructor,我想在下面的类a上实现一个复制构造函数,该类包含一个指向多态实现类基的指针。目前,我在类库中有一个虚拟create_copy()方法,派生类需要重写该方法。但是,派生类的重写都使用完全相同的代码。我是否缺少复制类型A对象的更简单方法?我真的需要为每个派生类复制完全相同的代码吗?下面是我现在使用的。如果它更改了答案,则需要运行时多态性 class A { public: A(const A& a): base_p {a.base_p->create_copy()} {} pr

我想在下面的类a上实现一个复制构造函数,该类包含一个指向多态实现类基的指针。目前,我在类库中有一个虚拟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);
  }
};
A类{
公众:
A(常量A&A):base_p{A.base_p->create_copy()}{
私人:
唯一的\u ptr基\u p;
};
阶级基础{
公众:
虚拟唯一\u ptr create\u copy()常量;
};
派生类:公共基{
公众:
唯一\u ptr create\u copy()常量覆盖{
返回make_unique(*此项);
}
};
我的一个想法是使用一些代码,比如:

return make_unique<remove_reference_t<decltype(*this)>>(*this);
返回make_unique(*此项);
但是,此代码在常量成员函数中不起作用。此外,我认为我仍然必须在每个派生类中显式重写create_copy()方法,因为decltype(*this)是在编译时计算的,因此将该代码放入基类方法对我没有任何好处

编辑: 现在的答案比我需要的更复杂。我有一个简单的问题 深度1的继承层次结构,不需要扩展到更大的深度。Iorro的回答和提供的链接足以解决我的问题。

  • 具有中间BaseImplCopy模板类
  • 在其中为T实现create_copy()
  • 使其从基础派生
  • 让派生自BaseImplCopy
这被称为CRTP,被广泛使用。请注意,您可能需要在BaseImplCopy中进行静态转换(this)


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

您可能对可能的副本感兴趣。设计是否真的需要一个
唯一的\u ptr
,在每个副本上都克隆内容@Dieter实现类保持它们自己的状态。并且副本需要有该州的独立副本。也有利益关系;搜索BaseCrtp谢谢。我试试看。