如何为派生 类 通用地实现复制构造函数?
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()。
我想在下面的 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()。