8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

赋值运算符继承

Caleth 2月前

141 0

有这样的代码:#include类 Base {public: Base(){ std::cout << \'构造函数 base\' << std::endl; } ~Base(){ std::cout << \'

有这样的代码:

#include <iostream>

class Base {
public:
    Base(){
        std::cout << "Constructor base" << std::endl;
    }
    ~Base(){
        std::cout << "Destructor base" << std::endl;
    }
    Base& operator=(const Base& a){
        std::cout << "Assignment base" << std::endl;
    }
};

class Derived : public Base{
public:

};

int main ( int argc, char **argv ) {
    Derived p;
    Derived p2;
    p2 = p;
    return 0;
}

经过g++4.6编译后的输出:

Constructor base
Constructor base
Assignment base
Destructor base
Destructor base

为什么虽然说赋值运算符不能被继承,但却调用基类的赋值运算符呢?

帖子版权声明 1、本帖标题:赋值运算符继承
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Caleth在本站《class》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 你没有默认

    Derived& operator=(const Base& a);
    

    在你的 Derived 班级里。

    但是,会创建一个默认的赋值运算符:

    Derived& operator=(const Derived& a);
    

    这会从 调用赋值运算符 Base 。因此,这不是继承赋值运算符的问题,而是通过派生类中的默认生成运算符调用它的问题。

  • 正如我引用 98 c++ 标准中的一句话“运算符函数的继承方式与其他基类函数的继承方式相同”。它刚刚被为派生类隐式创建的运算符 = 所隐藏。

  • \'它刚刚被为派生类隐式创建的运算符=隐藏\'。就像如果基类有 void func(int) 并且派生类有 void func(double),则基类函数 void func(int) 被隐藏。类似地,基类运算符= 被派生类运算符= 隐藏。

  • ...需要明确的是,由于基本运算符 = 仅被隐藏,因此可以使用 Base::operator= 在派生类中将其取消隐藏;然后,轰隆隆:它就在那里,被继承了。请参阅:.com/questions/4122214/…

  • 实际上,所调用的是隐式定义的 operator = Derived 编译器提供的定义依次调用​​, operator = 然后 Base 您会看到相应的输出。构造函数和析构函数也是如此。当您让编译器定义时 operator = ,它会按如下方式定义它:

    Derived& operator = (const Derived& rhs)
    {
        Base1::operator =(rhs);
        ...
        Basen::operator =(rhs);
        member1 = rhs.member1;
        ...
        membern = rhs.membern; 
    }
    

    其中 Base1,...,Basen ,类的基础(按照在继承列表中指定它们的顺序)并且 member1, ..., membern Derived 的成员(不计算继承的成员)按照在类定义中声明它们的顺序排列。

  • 最好在该定义中添加一个返回语句,可能它只是返回 *this?如果 Base1 的运算符不返回对自身的引用(但通常情况如此),这可能与 Base1 的行为不同。

  • 您还可以使用'using':

    class Derived : public Base{
    public:
        using Base::operator=;
    };
    

    http://en.cppreference.com/w/cpp/language/using_declaration

    在有人帮助我之前,我读过这篇文章好几次。

  • 终于有人说出来了。+1。另请参阅:.com/questions/4122214/…

  • 如果您在 Derived 类中声明了其他变量,但使用了此技术,会发生什么情况?它会正确分配来自 Derived 的新变量吗?

  • 标准规定(12.8):

    赋值运算符应由非静态成员函数实现,且该函数只有一个参数。由于如果用户未声明,则将为类隐式声明复制赋值运算符 operator= (12.8),因此基类赋值运算符始终被派生类的复制赋值运算符隐藏。

    然后派生的赋值运算符调用你的基类

    非联合类 X 的隐式定义复制/移动赋值运算符对其子对象执行成员级复制/移动赋值。首先按基说明符列表中声明的顺序对 X 的直接基类进行赋值,然后按类定义中声明的顺序对 X 的直接非静态数据成员进行赋值。

  • 引用 12

    这是因为创建的默认赋值运算符调用它的基本赋值运算符,即它没有被继承,但仍被调用为默认赋值运算符的一部分。

  • 赋值运算符是从基类继承的。它只是被派生类中编译器生成的运算符隐藏了。使用 using Base::operator=; 可以通过取消隐藏基类实现并通过派生类使其可用来证明这一点。请参阅:.com/questions/4122214/…

  • 赋值运算符确实不能被继承。继承该运算符将使你能够将 a 赋值 Base 给 a Derived ,但是 Base b; p = a; (理所当然地)编译失败。

    实际情况是 operator= ,由于您没有为 定义自定义的 , Derived 。自动生成的 operator= 会调用所有基类和所有成员的赋值运算符。在这方面,它与构造函数/析构函数非常相似,它们也会在所有基类/成员上调用相应的函数。

  • 赋值运算符是从基类继承的。它只是被派生类中编译器生成的运算符隐藏了。使用 using Base::operator=; 可以通过取消隐藏基类实现并通过派生类使其可用来证明这一点。请参阅:.com/questions/4122214/…

返回
作者最近主题: