这个问题曾经困扰过我一阵子。请先看一下下面的源代码:
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++类对象的构造开始分析,结果找到了我认为是正确的答案: