C++ c++;运算符=奇怪的behviour

C++ c++;运算符=奇怪的behviour,c++,operator-keyword,C++,Operator Keyword,帮忙?我真的不知道这里发生了什么? 为什么在赋值的第3行中,当它将B赋值给B时,它调用A的运算符=呢 class A{ public: A& operator=(const A&){cout << "A assignment" << endl;return *this;} }; class B:public A{ public: A& operator=(const A&){cout << "B assig

帮忙?我真的不知道这里发生了什么? 为什么在赋值的第3行中,当它将B赋值给B时,它调用A的运算符=呢

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;
}
A类{
公众:

A&operator=(const A&){cout类
B
中仍然有一个编译器生成的赋值运算符(它重载了);与构造函数的工作方式不同,定义一个或多个赋值运算符重载不会阻止编译器在缺少赋值运算符时生成副本赋值运算符。编译器生成的赋值运算符调用
a::operator=
。它更适合于
B
类型的参数
B
中的运算符,但编译器还生成了另一个隐式复制赋值运算符:

B& B::operator=(B const&);
这比采用
a常量的匹配更好&
,因此在赋值
b=b2
中选择它(因为
b2
是一个
b
,采用
a
的匹配不需要从派生到基的转换)。隐式复制赋值运算符调用您编写的基类的复制赋值运算符:

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

这就是为什么它看起来像
A::operator=(A const&)
正在被作业选中。

@jafar请看我之前的评论。可能重复的错误,我试图找出它,并对其进行了更改。它现在可以编译了。您希望实现什么?如何更好地匹配tho?它们完全相同,不是吗?@MichaelPapkov:一个重载(用户定义)取一个
A常量&
,另一个(编译器生成的)取一个
B常量&
。看起来你是对的,除非我显式重载B&B::operator=(B const&B)我自己,否则它会按你说的做。