我需要克隆一个仅给出基类引用或指针的派生类。下面的代码完成了这项工作,但看起来并不优雅,因为我将样板代码放入许多派生类 C、D、E 中,它们是 B(未显示)的兄弟,它们只调用每个的默认复制构造函数。如果它可以是虚拟的,这不是默认复制构造函数的用途吗?
有没有更好的办法?
创建虚拟赋值运算符是错误的,因为我不希望 C 赋值给 B,B 赋给 D,等等,只需克隆 B、C、D 或 E。
#include <iostream>
using namespace std;
class A {
public:
virtual ~A() {}
virtual A* clone()=0;
};
class B : public A {
int i;
public:
virtual A* clone() {
cout << "cloned B" << endl;
return new B(*this);
}
virtual ~B() { cout << "destroyed b" << endl; }
};
int main() {
A* a = new B();
A* aa = a->clone();
delete a;
delete aa;
return 0;
}
最佳答案
您始终可以将所有克隆逻辑粘贴到层次结构中间的自己的类中:
template <class Derived, class Base>
class CloneCRTP : public Base {
public:
Derived* clone() const override {
return new Derived(static_cast<Derived const&>(*this));
}
};
然后:
class B : public CloneCRTP<B, A>
{
int i;
public:
virtual ~B() { cout << "destroyed b" << endl; }
};
不再有样板文件。
关于C++通过调用基类优雅地克隆派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36189838/