为啥派生类不能继承operator =()函数[重复]

Posted

技术标签:

【中文标题】为啥派生类不能继承operator =()函数[重复]【英文标题】:Why can't the operator=() function be inherited by the derive class [duplicate]为什么派生类不能继承operator =()函数[重复] 【发布时间】:2011-06-08 03:43:25 【问题描述】:

可能重复:Trouble with inheritance of operator= in C++

我更新了代码

#include <QtCore/QCoreApplication>

class Base

    int num;
public:
    Base& operator=(int rhs)
    
        this->num = rhs;
        return *this;
    
;

class Derive : public Base

public:
    int deriveNum;
    using Base::operator =; // unhide the function
;

int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);

    Base base;
    Derive derive1, derive2;

    base = 1;  // calls Base::operator(1) and returns Base&

    derive1 = 11; // calls Base::operator(11) and returns Base&
    derive2 = 22; // calls Base::operator(22) and returns Base&

    derive1 = base;// Which function does it calls??
               // If it calls Base::operator(base) and
                   // returns a Base&, how could it be assigend to derive1?

    return a.exec();

我在评论中标记了问题,请给我更多帮助

【问题讨论】:

发布只产生相关错误的代码会有所帮助。~ 【参考方案1】:

由派生类继承的。但是,派生类有它自己的operator =(由编译器隐式声明),它隐藏从父类继承的operator =(搜索并阅读C++ 中的“名称隐藏”)。

如果您希望继承的operator = 可见,您必须明确取消隐藏它

class Derive : public Base

  std::string str;

public:
  using Base::operator =; // unhide
;

你的代码将被编译。 (如果您修复了明显的语法错误。请发布真实代码。)

附:这个问题经常被问到。作为对您问题的评论,我提供了指向更详细说明的链接。

【讨论】:

在添加“使用 Base::operator =;”之后代码仍然无法编译,但如果我写“d.Base::operator=(10);”它可以编译是因为我使用的编译器不支持这个吗?我正在使用 VC6 @shengy:首先,您是否使用声明 public 做到这一点?其次,您的代码还有其他问题。在Base 定义中声明Base 的成员函数时,不应使用前缀Base::。这是非法的。至于整个 using 方法:即使在 VC6 中也应该可以工作。 代码在MingW中可以编译,在VC6中不能编译。为什么?顺便说一句,我公开了声明,并删除了前缀 Base:: 我更新了这个问题,你能不能再给我一点帮助:)

以上是关于为啥派生类不能继承operator =()函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++继承(上)

为啥我不能访问派生构造函数的成员初始化列表中继承的受保护字段?

为啥我不能继承这个变量?

C++基类和派生类的构造函数

继承和派生

派生类继承基类赋值运算符?