c ++ operator =怪异的behviour

时间:2015-06-24 19:54:02

标签: c++ operator-keyword

帮助?我真的不知道这里发生了什么? 为什么在第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;
}

2 个答案:

答案 0 :(得分:2)

B中仍然存在编译器生成的赋值运算符(它已经重载);与构造函数的工作原理不同,定义一个或多个赋值运算符重载并不会阻止编译器在缺少复制赋值运算符时生成它。编译器生成了一个调用A::operator=。对于B类型的参数,它更匹配。

答案 1 :(得分:1)

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

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

这是一个比A const&更好的匹配,因此在作业b = b2中选择它(因为b2B它不是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++ } 的原因。