C++:是否可以继承赋值运算符?

Shu*_*hum 0 c++ inheritance templates

以下C++代码无法编译:

class BaseA {
protected:
    BaseA &operator = (const BaseA &rhs);
};

template<typename T>
class BaseB {
public:
    T &operator = (const T &rhs) {
        return *static_cast<T *>(this);
    };
};

class Derived :
    public BaseA,
    public BaseB<Derived> {
};

int main() {
    Derived foo;
    Derived bar;
    foo = bar;
    return 0;
};
Run Code Online (Sandbox Code Playgroud)

当我尝试编译这个时,我得到一个BaseA &BaseA::operator = (const BaseA &)未定义的投诉.在stackoverflow上还有其他几个这样的问题,但它们似乎都关注编译器自动生成一个Derived &Derived::operator = (const Derived &)调用的函数BaseA::operator = (const BaseA&).在这种情况下,虽然Derived应该已经继承了具有该确切签名的函数BaseB<Derived>.如果我按照另一个问题的建议并添加using BaseB<Derived>::operator =;Derived编译器抱怨Derived &operator = (const Derived &)不能重载.

是否一个类继承此运算符是不可能的?

编辑:要清楚,我很困惑,为什么编译器给Derived默认Derived &operator = (const Derived &)时,它已经继承T &operator (const T &) where [T = Derived]Base<Derived>.我可以理解为什么通常会创建默认的复制赋值运算符并覆盖任何继承的赋值运算符,但在这种情况下,Derived它继承的运算符与其复制赋值运算符具有完全相同的签名.有没有办法写BaseB它的子类使用这个运算符?

小智 5

不,赋值运算符operator=不是继承的.您没有默认值

Derived& operator=(const BaseA& a);
Run Code Online (Sandbox Code Playgroud)

在您的Derived类中.

但是,会创建一个默认赋值运算符:

Derived& operator=(const Derived& a);
Run Code Online (Sandbox Code Playgroud)

这会调用赋值运算符BaseA.所以这不是继承赋值运算符的问题,而是通过派生类中的默认生成运算符调用它.还有一些说明:标准说(12.8):

赋值运算符应由具有一个参数的非静态成员函数实现.因为如果没有由用户声明(12.8),则为类隐式声明复制赋值运算符operator =,基类赋值运算符总是被派生类的复制赋值运算符隐藏.

然后赋值操作符派生调用你的基础

非联合类X的隐式定义的复制/移动赋值运算符执行其子对象的成员复制/移动分配.首先按照它们在base-specifier-list中的声明顺序分配X的直接基类,然后按照它们在类定义中声明的顺序分配X的直接非静态数据成员. .