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&amp; operator=(const Derivate&amp;);,而不是Derivate&amp; operator=(const Base&amp;); @aschepler 是的,我知道我说过编译器隐式添加了Derivate&amp; operator=(const Base&amp;);,这反过来又调用了基础

以上是关于C++操作符=重载继承,基类中定义了,派生类中是不是需要重新定义? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c ++继承:基类中的2次重载运算符+在派生类中无法正常工作

C++中派生类重写基类重载函数时需要注意的问题:派生类函数屏蔽基类中同名函数

c++中的虚函数有啥作用?

在C++中,啥是运算符重载?啥是虚函数?

C++,如何在派生类中调用基类的重载提取运算符?

c++继承是如何工作的?