C++ c++;运算符=奇怪的behviour
帮忙?我真的不知道这里发生了什么? 为什么在赋值的第3行中,当它将B赋值给B时,它调用A的运算符=呢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
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)我自己,否则它会按你说的做。