为啥派生类不能继承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 =()函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章