赋值运算符重载函数被继承了吗?

来源:互联网 发布:uu淘宝店没评价 编辑:程序博客网 时间:2024/04/28 21:00

       C++语法规定赋值运算符重载函数不能被继承。关于这一点我的理解是赋值运算符和构造、析构函数一样,都是为类量身定做的,继承没有意义,所以编译器屏蔽了这个继承。

    最近在网上看到一篇文章(http://blog.csdn.net/pbmichael/article/details/1608250),认为“‘赋值运算符重载函数’不是不能被派生类继承,而是被派生类的默认‘赋值运算符重载函数’给覆盖了。这就是C++赋值运算符重载函数不能被派生类继承的真实原因!”这个观点是不对的,真实的情况如开头所述,赋值运算符不是被覆盖,而是根本没有继承。

    为论证该文章中的观点是错误的,我首先要说明不是所有类都自动生成赋值运算符的。当类中含有常数据成员或者引用时,赋值运算符不自动生成,请看下面程序1。由于类B1含有常数据成员和引用,所以编译器并没有自动给其生成赋值运算符,对语句"v=w"进行了报错

//程序1 

#include <iostream>
using namespace std;

class B1 
{
public:
        const int m;
        int &p;
        B1(int i=0, int j=0);
};
B1::B1(int i, int j):m(i),p(j)
{cout<<"B1 constructed;"<<endl;}

void main()
{        
        B1 v,w;
        v=w;
//报错error C2582: 'B1' : 'operator =' function is unavailable
}

下面用程序1中没有自动生成赋值运算符的类B1去继承一个重载了赋值运算符的类A1,见程序2。对语句"v=2"同样报错,说明类B1中并没有赋值运算符的定义,即没有从A1中继承赋值运算符。

//程序2
#include <iostream>
using namespace std;

class A1
{
public:
        int operator=(int a)
        {
          return 1;
        }   
};

class B1 : public A1
{
public:
        const int m;
        int &p;
        B1(int i=0, int j=0);
};
B1::B1(int i, int j):m(i),p(j)
{cout<<"B1 constructed;"<<endl;}

void main()
{        
    A1 a;    
    B1 v,w;
    cout << (a = 2) << endl; 
// 正确,输出1

    cout << (v = 2) << endl;

//报错:error C2582: 'B1' : 'operator =' function is unavailable
}

    从上面的例子我们可以验证我们的结论:C++中赋值运算符重载函数没有被继承,而不是由于派生类生成的新赋值运算符覆盖了基类的赋值运算符。

原创粉丝点击