为什么C++赋值运算符重载函数不能被继承?

这个问题曾经困扰过我一阵子。请先看一下下面的源代码:

class A1
{
public:
         int perator=(int a)
         {
                 return 8;
         }

         int operator+(int a)
         {
                 return 9;
         }
};

class B1 : public A1
{
public:
         int operator-(int a)
         {
                 return 7;
         }
};

int main()
{        
         B1 v;
         cout << (v + 2) << endl; // OK, print 9
         cout << (v - 2) << endl; // OK, print 7
         cout << (v = 2) << endl; // Error, see below

         return 0;
}

VC
编译器的错误提示:

error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'const int' (or there is no acceptable conversion)

意思是说编译器找不到int perator=(int a)这个成员函数可以调用。

真是怪了?明明int perator=(int a)这个函数是我从基类公有继承下来的函数,怎么编译器识别不了呢?遇到这种问题,第一反应就是查找MSDN以求得解释,微软告诉我:

“All overloaded operators except assignment (operator=) are inherited by derived classes.”

意思是说:除了赋值运算符重载函数以外,所有的运算符重载函数都可以被派生类继承。

我这个函数int perator=(int a)很不幸就是微软所说的赋值运算符重载函数,当然不能被继承!

可是到此为止,我心中的疑问依然没有消除。为什么赋值运算符重载函数不能被派生类继承呢?从C++语义上讲,不允许这个函数被派生类继承并没有充足的理由,一个类对象实例完全可以被任何一个其他类对象实例所赋值!比如一个颜色对象实例可以被一个整数赋值,甚至可以被一个小白兔实例所赋值。赋值运算符既然允许重载,就应该允许被继承,就像其他的运算符重载之后都可以被派生类继承一样。微软的解释并没有说明为什么赋值运算符重载函数不能被继承的幕后原因。

我又查找了C++ Primer和其他一些重量级的C++经典,可是这些书籍对此问题都避而不谈,抑或是语焉不详,我都没有找到答案。于是,我只好反身求诸己,从C++类对象的构造开始分析,结果找到了我认为是正确的答案:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值