将赋值运算符的复制和交换习惯用于派生类

时间:2015-05-11 06:40:44

标签: c++ c++11

从包含此one的各种帖子中我注意到了复制和交换习惯用法但是我不确定如何在派生类中实现此代码。 那里的代码指定为

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;
}

我的理解是,如果我们从派生类调用基类赋值运算符,那么复制构造函数(因为参数是值类型)将被调用两次(一个用于派生,然后再用于base)(这只是如果它是一个单一的继承链)什么是调用派生类的副本赋值运算符和基类的最佳方法?我们是否需要更改swap方法?

3 个答案:

答案 0 :(得分:0)

你混合了两个在不同背景下运作的习语。

交换调用可以交换POD或类似的内容。

另一方面,如果你有一个可能不正确的类层次,那么第二种方法(依赖基类知道如何交换本身可能更合适)。

但还有一点值得一提:覆盖operator =是典型的具有值语义的类,而当你开始处理派生类(并且可能只处理持有指向基类的指针的对象)时,这不再是case(你宁愿克隆()对象而不是复制它们)

答案 1 :(得分:0)

在此方案中,无需在派生类的baseclass::operator=中调用operator=。当您按值传递参数时,您已经获得了派生类的复制构造函数生成的有效副本,特别是应该调用基类的复制构造函数。因此,您的初始代码也非常适用于派生类。

答案 2 :(得分:0)

  

将赋值运算符的复制和交换惯用法与派生类

一起使用

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