繁体   English   中英

C ++操作符=怪异的行为

[英]c++ operator= weird behviour

救命? 我真的不知道这是怎么回事? 为什么在分配的第3行中,当B分配给B时,它调用A的operator =?

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;
}

B类中仍然有一个由编译器生成的赋值运算符(已重载); 与此方法与构造函数的工作方式不同,定义一个或多个赋值运算符重载并不能防止编译器在缺少一个赋值运算符时生成副本赋值运算符。 编译器生成了一个调用A::operator= 而且它更适合B类型的参数。

您已经在B定义了一个赋值运算符,但是编译器还生成了另一个隐式的copy-assignment运算符:

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

这是一个比,需要一个更好的匹配A const&所以它在分配选择b = b2 (因为b2B它不需要派生到基转换为一个接受一个A )。 隐式copy-assignment运算符调用您编写的基类的copy-assignment运算符:

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

这就是为什么分配似乎选择了A::operator=(A const&)原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM