C++操作符=重载继承,基类中定义了,派生类中是不是需要重新定义? [复制]
Posted
技术标签:
【中文标题】C++操作符=重载继承,基类中定义了,派生类中是不是需要重新定义? [复制]【英文标题】:C++ operator = overload inherited, is it necessary to redefine in the derived class though defined in the base class? [duplicate]C++操作符=重载继承,基类中定义了,派生类中是否需要重新定义? [复制] 【发布时间】:2016-11-14 19:51:01 【问题描述】:假设我有这个 C++ 代码:
class Base
public:
Base& operator=(const Base&);
;
class Derivate : public Base
public:
;
说我有一个主要的地方
Derivate d1;
//Something on d1
Derivate d2 = d1;
在这种情况下会调用基类的操作符=
吗?我有一些代码基本上可以做这样的事情,但是用 gdb 调试我没有看到对这样的操作员的任何调用。
在这种情况下是否有必要重新定义派生类中的运算符?
【问题讨论】:
编译器很乐意为您隐式生成一个。但您需要确保它具有正确的语义。 所以它不会使用从基类继承的,对吧?复制构造函数也一样吗?Base::operator=
没有被调用的原因是Derivate d2 = d1;
使用了复制构造函数,而不是赋值运算符。
会的。隐式生成的调用所有基类和成员的赋值运算符。复制 c'tor 也是如此。但同样,如果你的类中有指针等,默认情况下它可能不是你想要的行为。
type name = something
总是构造而不是赋值。
【参考方案1】:
实际上,您调用的是复制构造函数,因为您在构造 d2 时将 d1 分配给 d2,因此此处不调用赋值运算符:
#include <iostream>
using namespace std;
class Base
public:
Base& operator = (const Base&);
;
Base& Base::operator = (const Base&)
cout << "assignment operator" << endl;
// implementation here
return *this;
class Derivate : public Base
public:
Derivate()
Derivate(const Derivate& rhs)cout << "copy constructor" << endl;
;
int main()
Derivate d1;
//Something on d1
Derivate d2 = d1; // copy constructor not assignment operstor
//Derivate d2(d1); // is the same as above calling cpy ctor
d2 = d1; // here assignment operator is called
return 0;
为什么d2 = d1;
调用基本赋值运算符?
因为如果您不提供派生类赋值运算符,编译器将为您定义一个如下:
Derivate& operator = (const Base& rhs); // not Derivate
所以只要传递一个 const 引用而不是派生的引用,这个 Derived one 就会调用,因为您猜测 base 的赋值运算符。
赋值运算符确实是继承的:在基类中将其设为私有作用域并查看结果。
【讨论】:
自动声明的赋值运算符是Derivate& operator=(const Derivate&);
,而不是Derivate& operator=(const Base&);
。
@aschepler 是的,我知道我说过编译器隐式添加了Derivate& operator=(const Base&);
,这反过来又调用了基础以上是关于C++操作符=重载继承,基类中定义了,派生类中是不是需要重新定义? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
c ++继承:基类中的2次重载运算符+在派生类中无法正常工作