帮助?我真的不知道这里发生了什么? 为什么在第3行的赋值中,当它将B分配给B?
时,它调用operator = of 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;
}
答案 0 :(得分:2)
类B
中仍然存在编译器生成的赋值运算符(它已经重载);与构造函数的工作原理不同,定义一个或多个赋值运算符重载并不会阻止编译器在缺少复制赋值运算符时生成它。编译器生成了一个调用A::operator=
。对于B
类型的参数,它更匹配。
答案 1 :(得分:1)
您已在B
中定义了一个赋值运算符,但还有另一个由编译器生成的隐式复制赋值运算符:
B& B::operator=(B const&);
这是一个比A const&
更好的匹配,因此在作业b = b2
中选择它(因为b2
是B
它不是A
需要对B& B::operator=(B const& b) {
A::operator=(b);
return *this;
}
)进行派生到基础的转换。隐式复制赋值运算符调用您编写的基类的复制赋值运算符:
A::operator=(A const&)
这就是分配选择###(pseudocode)
function create_unique_url($url, $id) {
try to insert the url, id combination
if success:
return url
else:
key = 1
start a loop
try to insert the url+key, id combination
if success:
return url
key++
}
的原因。