C++ 对派生类使用赋值运算符的复制和交换习惯用法

C++ 对派生类使用赋值运算符的复制和交换习惯用法,c++,c++11,C++,C++11,从包括本文在内的多篇文章中,我注意到了复制和交换习惯用法,但是我不确定在涉及派生类时如何实现这段代码。 那里的代码被指定为 dumb_array& operator=(dumb_array other) // (1) { swap(*this, other); // (2) return *this; } 我理解,无论何时在派生类中定义自定义赋值运算符,该方法都有责任调用基类的赋值运算符。在这种情况下,我将如何最佳地调用基类的赋值运算符。这是我的尝试 dumb_arr

从包括本文在内的多篇文章中,我注意到了复制和交换习惯用法,但是我不确定在涉及派生类时如何实现这段代码。 那里的代码被指定为

dumb_array& operator=(dumb_array other) // (1)
{
    swap(*this, other); // (2)

    return *this;
}
我理解,无论何时在派生类中定义自定义赋值运算符,该方法都有责任调用基类的赋值运算符。在这种情况下,我将如何最佳地调用基类的赋值运算符。这是我的尝试

dumb_array& operator=(dumb_array other)
{
    swap(*this, other); 
    baseclass::operator= other; //Suppose base class has assignment operator resembling this
    return *this;
}

我的理解是,如果我们从派生类调用基类赋值运算符,那么复制构造函数(因为参数是value type)将被调用两次,一次调用派生类,然后再次调用基类。只有当它是单继承链时,调用的复制赋值运算符的最佳方式是什么派生类和基类?我们需要对swap方法进行更改吗?

您混合了两种在不同上下文中使用的习惯用法

交换呼叫可以交换POD或类似的东西

另一方面,当您有一个可能不是正确的类层次结构时,这里的第二种方法依赖于知道如何交换自己的基类可能更合适

但还有一点值得一提:重写运算符=是具有值语义的类的典型特征,当您开始处理派生类并可能处理仅包含指向基类的指针的对象时,情况就不再是这样了,您宁愿克隆对象而不是复制它们

在这种情况下,不需要在派生类的operator=中调用baseclass::operator=。当您通过值传递参数时,您已经获得了派生类的复制构造函数生成的有效副本,它尤其应该调用基类的复制构造函数。所以您的初始代码对于派生类也是完全有效的

对派生类使用赋值运算符的复制和交换习惯用法


这不是你应该做的事情,因为这个问题。如果您的类具有多态行为,通常不需要赋值-您需要复制值,记住多态行为。这意味着克隆,在基类级别定义并在整个层次结构中实现。

是否有必要调用baseclass::operator=?