C++通过调用基类优雅地克隆派生类

标签 c++ inheritance clone

我需要克隆一个仅给出基类引用或指针的派生类。下面的代码完成了这项工作,但看起来并不优雅,因为我将样板代码放入许多派生类 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/

相关文章:

python - 在类定义中添加参数

Java继承和重写方法——修饰符的影响

android - 以编程方式克隆 Android 应用程序

C# 通用复制构造函数

c++ - 无法使用 winapi 获取资源位图大小

c++ - 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接

Swift 继承/对象结构

git - Git : Repository, fork, branch, clone, track 这些词是什么意思?

c++ - 如何使用 C 或 C++ 查找给定的 IPv6 地址是否在 CIDR 范围内?

c++ - 在单个(成员)函数的范围之外应用 RAII