赋值运算符是否继承?

Is the assignment operator inherited or not?

我知道赋值运算符不会被派生类继承,相反,如果不重新声明,编译器将创建一个默认运算符。但是我不明白为什么以下代码片段的输出是 Base operator=:

#include  <iostream>
using namespace std;


class B {
protected:
    int h;
public:
        B& operator=(const B& ob){
        if (this!=&ob)         {
        h = ob.h;
        cout << "Base operator=\n";
        }
        return *this;
        }
};

class D: public B  {
protected:
    float r;
public:
};


int main() {

    D a, b;

    a = b;

    return 0;
}

那不是说在调用a = b基数B& operator=(const B& ob的时候,不就是继承了吗?我哪里错了?

使用表达式a = b,编译器为D生成的赋值运算符调用B中用户定义的赋值运算符。

是的,你是正确的,赋值运算符不是继承的。

生成的赋值是“所有基础赋值,按照继承声明的顺序”,所以你生成的赋值本质上是

D& operator=(const D& d)
{
    B::operator=(d);
    return *this;
}

如果您要从 BC 派生 - 按此顺序; class D: B, C - 相当于

D& operator=(const D& d)
{
    B::operator=(d);
    C::operator=(d);
    return *this;
}

即赋值不是继承的,而是被使用的