可克隆层次结构中的 C++ 复制构造函数和赋值

标签 c++ inheritance cloning

有一个著名的clone 习惯用法,用于通过指向Base 类的指针复制Derived 对象。

class Base{
  int b;
public: 
  virtual unique_ptr<Base> clone() const = 0;
  virtual ~Base() = default;
};

class Derived : public Base {
  int d;
public:
  virtual unique_ptr<Base> clone() const override {
    return std::make_unique<Derived>(*this);
  }
}

但是,在这种情况下,我找不到如何定义复制构造函数和赋值的明确说明。这就是我认为应该在 Base 类中完成的方式:

class Base {
protected:
  Base(const Base&) = default;
private:
  Base& operator=(const Base&) = delete;
}

是否有必要(为了避免潜在的切片)?这是正确的方法吗?这是否足够,或者我是否应该将此类声明也添加到 Derived 类中?

最佳答案

由于派生类使用复制构造函数来创建克隆,您可能希望将复制构造函数设置为非公共(public)的,以避免意外切片但派生类可以访问。

protected 满足这个要求。它需要应用于每个类的复制构造函数,因为编译器生成的复制构造函数是public。对赋值运算符应用相同的处理方式也是有意义的。

虽然这也阻止了 std::make_unique 访问复制构造函数:

class A
{
protected:
    A(A const&) = default;
    A& operator=(A const&) = default;
public:
    A();
    virtual std::unique_ptr<A> clone() const = 0;
};

class B : public A
{
protected:
    B(B const&) = default;
    B& operator=(B const&) = default;
public:
    B();

    std::unique_ptr<A> clone() const override { 
        return std::unique_ptr<A>(new B(*this)); 
    }
};

关于可克隆层次结构中的 C++ 复制构造函数和赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49053789/

相关文章:

performance - Solidity 中的组合优于继承 - Gas 效率

java - 在 Java 中最好没有工厂的情况下克隆通用对象的有效方法

c# - 深度克隆一个对象

c++ - 如何理解这个答案中 "q = i - 4; "的代码?

c++ - 一个函数而不是复制粘贴编程

c++ - 解决在 C++ 中调用具有相同名称的函数的方法中的冲突

java - 如何继承/使用多个类的方法

c++ - 我的幂函数有什么问题,以2为底,n为指数并以10 ^ 9 + 7为模计算答案?

C++ 函数 = 删除

JQuery:将行为转移到克隆对象