c++ operator= 奇怪的行为

c++ operator= weird behviour

帮忙?我真的不知道这里发生了什么? 为什么在赋值的第 3 行它调用 A 的 operator=,而它是 B 到 B 的赋值?

class A{
public: 
    A& operator=(const A&){cout << "A assignment" << endl;return *this;}
};

class B:public A{
public: 
    A& operator=(const A&){cout << "B assignment" << endl;return *this;}
};

int main() {
    A a;
    B b;
    B b2;       
    a=b; //  output: A assignment
    b=a; //  output: B assignment
    b=b2; //  output: A assignment WHY??
    return 0;
}

classB中仍然有一个编译器生成的赋值运算符(已重载);与构造函数的工作方式不同,定义一个或多个赋值运算符重载不会阻止编译器在缺少赋值运算符时生成复制赋值运算符。编译器生成了一个调用 A::operator=。它更适合 B.

类型的参数

您在 B 中定义了一个赋值运算符,但编译器还生成了另一个隐式复制赋值运算符:

B& B::operator=(B const&);

这比采用 A const& 的匹配更好,因此在作业 b = b2 中选择了它(因为 b2B 它不需要对采用 A 的那个进行派生到基础的转换)。隐式复制赋值运算符调用您编写的基 class 的复制赋值运算符:

B& B::operator=(B const& b) {
    A::operator=(b);
    return *this;
}

这就是为什么看起来 A::operator=(A const&) 被作业选中的原因。