我想在下面的类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的答案以及提供的链接足以解决我的问题。
答案 0 :(得分:2)
这称为CRTP,被广泛使用。请注意,您可能需要在BaseImplCopy中使用static_cast(this)。
顺便说一句,create_copy()通常称为clone()。