赋值运算符重载函数被继承了吗?
来源:互联网 发布: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++中赋值运算符重载函数没有被继承,而不是由于派生类生成的新赋值运算符覆盖了基类的赋值运算符。
- 赋值运算符重载函数被继承了吗?
- 为什么C++赋值运算符重载函数不能被继承?
- 为什么C++赋值运算符重载函数不能被继承?
- 为什么C++赋值运算符重载函数不能被继承?
- 为什么C++赋值运算符重载函数不能被继承?
- 为什么C++赋值运算符重载函数不能被继承?
- 为什么C++赋值运算符重载函数不能被继承?
- 为什么C++赋值运算符重载函数不能被继承?
- 为什么C++赋值运算符重载函数不能被继承? 【转】
- 赋值运算符重载函数
- 赋值运算符重载函数
- 赋值运算符的重载函数
- 类中赋值运算符重载函数
- 拷贝构造函数/重载赋值运算符
- c++赋值运算符重载函数
- 赋值运算符的重载函数
- C++赋值构造函数和赋值运算符的重载
- 重载赋值运算符
- wikioi p1011 数的计算
- Android用户界面UI组件--AdapterView及其子类(五) Spinner和SpinnerAdapter
- Configure Oracle 11gR2 RAC 一节点执行root.sh脚本报错
- Spring中的DI和AOP
- POJ 3274 Gold Balanced Lineup(哈希表)
- 赋值运算符重载函数被继承了吗?
- 兔子和獾——python游戏(python3.3.2版本Bug修改)
- wikioi p1978 Fibonacci数列 3
- shap
- wikioi p1501 二叉树最大宽度和高度
- Cross origin requests are only supported for HTTP
- 微软CEO史蒂夫·鲍尔默(Steve Ballmer)在12个月内退休
- 常用的函数:atoi,itoa,atof,_ttoi等
- 产生正确的行为