赋值运算符是否继承?
Is the assignment operator inherited or not?
我知道赋值运算符不会被派生类继承,相反,如果不重新声明,编译器将创建一个默认运算符。但是我不明白为什么以下代码片段的输出是 Base operator=
:
#include <iostream>
using namespace std;
class B {
protected:
int h;
public:
B& operator=(const B& ob){
if (this!=&ob) {
h = ob.h;
cout << "Base operator=\n";
}
return *this;
}
};
class D: public B {
protected:
float r;
public:
};
int main() {
D a, b;
a = b;
return 0;
}
那不是说在调用a = b
基数B& operator=(const B& ob
的时候,不就是继承了吗?我哪里错了?
使用表达式a = b
,编译器为D
生成的赋值运算符调用B
中用户定义的赋值运算符。
是的,你是正确的,赋值运算符不是继承的。
生成的赋值是“所有基础赋值,按照继承声明的顺序”,所以你生成的赋值本质上是
D& operator=(const D& d)
{
B::operator=(d);
return *this;
}
如果您要从 B
和 C
派生 - 按此顺序; class D: B, C
- 相当于
D& operator=(const D& d)
{
B::operator=(d);
C::operator=(d);
return *this;
}
即赋值不是继承的,而是被使用的
我知道赋值运算符不会被派生类继承,相反,如果不重新声明,编译器将创建一个默认运算符。但是我不明白为什么以下代码片段的输出是 Base operator=
:
#include <iostream>
using namespace std;
class B {
protected:
int h;
public:
B& operator=(const B& ob){
if (this!=&ob) {
h = ob.h;
cout << "Base operator=\n";
}
return *this;
}
};
class D: public B {
protected:
float r;
public:
};
int main() {
D a, b;
a = b;
return 0;
}
那不是说在调用a = b
基数B& operator=(const B& ob
的时候,不就是继承了吗?我哪里错了?
使用表达式a = b
,编译器为D
生成的赋值运算符调用B
中用户定义的赋值运算符。
是的,你是正确的,赋值运算符不是继承的。
生成的赋值是“所有基础赋值,按照继承声明的顺序”,所以你生成的赋值本质上是
D& operator=(const D& d)
{
B::operator=(d);
return *this;
}
如果您要从 B
和 C
派生 - 按此顺序; class D: B, C
- 相当于
D& operator=(const D& d)
{
B::operator=(d);
C::operator=(d);
return *this;
}
即赋值不是继承的,而是被使用的