在C++中,普通函數能夠被繼承,但是析構函數和構造函數不能被繼承。這裡有個問題,C++賦值號能否被繼承?
看以下代碼:
#include <iostream>
using namespace std;
class A{
public:
A() {
a = 0;
cout<<"A::A()"<<endl;
}
A & operator =(A &aa) {
cout<<"A:="<<endl;
this->a = aa.a;
return *this;
}
int a;
};
class B:public A{
public:
B() {
i=1;
cout<<"B::B()"<<endl;
}
public:
int i;
};
int main(void){
A a, b;
a.a = 100;
b.a = 200;
a = b;
cout<<a.a<<endl;
B b1, b2;
b1.a = 1;
b1.i = 10;
b2.a = 2;
b2.i = 20;
cout <<"***************"<<endl;
b1 = b2;
cout<<"b1.a: "<<b1.a<<" "<<"b1.i "<<b1.i<<endl;
return 0;
觀察輸出結果:
可以看到沒有出錯,調用的是A類的重載賦值號方法,而且賦值成功。按理說A類只對A的屬性進行賦值號重載,返回A對象,B類的屬性應該沒有值才對。這是為什麼呢?原因是系統自動生成了賦值符號,即使B類沒有對賦值號重載,一樣可以賦值成功。
我們再在類B內對賦值號進行重載,代碼如下:
B& operator =(B &bb){
cout<<"B:="<<endl;
this->a = bb.a;
this->i = bb.i;
return *this;
}
再觀察輸出結果:
此時調用的是B類的重載賦值號方法
作者 Wentasy