这两种调用基类复制赋值方法有什么区别?

时间:2014-10-21 20:05:00

标签: c++

假设我有以下内容:

class A
{
public:
    A& operator= (A const& other)
    {
        return *this;
    }
};

class B : public A
{
public:
    B& operator= (B const& other)
    {
        static_cast<A&>(*this) = static_cast<A const&>(other);
        // or...
        A::operator=(other);
        return *this;
    }
};

要调用A版本的复制赋值运算符,我可以这样做:

static_cast<A&>(*this) = static_cast<A const&>(other);

或者:

A::operator=(other);

为什么选择一个而不是另一个?这两者有什么不同?

修改

我的问题的最初例子是无效的,与我打算提出的问题相去甚远。我为这个错误道歉。我已经更新了上面的例子,以便更清楚。

2 个答案:

答案 0 :(得分:7)

static_cast<A&>(*this).foo()仍调用foo的派生版本。这只是通过基类引用调用虚函数。

A::foo()关闭虚拟调度并调用类foo中实现的A,而不是派生类。


如果operator=中的A不是虚拟的,则static_cast<A&>(*this) = static_cast<A const&>(other)是另一种说法A::operator=(other)的方式(无需向上转发other,因为派生到基准参考转换是隐含的)。他们做同样的事 - 打电话给A::operator=

通常,operator=是根据复制构造函数实现的,后跟swap:

B& B::operator=(B other) { 
    other.swap(*this); 
    return *this;
}

按值B为我们调用B的复制构造函数。如果B具有r值复制构造函数,则此赋值运算符可以与r值一起使用,也可以仅移动B(如果B,则std::unique_ptr具有{{1}} }成员)。

答案 1 :(得分:0)

如果你想要两个类(A和B)的A赋值运算符,只是不要在B类中实现它。