有一个著名的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/