喜歡就點個關注丫~
這裏所說的“基類的子對象”即基類的數據成員
在C++中,構造函數不能被繼承,因此,派生類的構造函數必須通過調用基類的構造函數來初始化基類子對象。
在派生類初始化列表直接初始化基類的成員,被稱爲“越級初始化”,是會報錯的。
舉個栗子:
我們先創建一個基類,裏面有一個int型子對象
class A{
protected:
int n;//基類的子對象
public:
A();
A(int temp):n(temp){}
};
然後創建一個派生類,並用派生類構造函數的初始化列表來進行“越級初始化”
class B:public A{
public:
B(int temp):n(temp){}//對基類子對象n進行初始化
};
在主函數中調用
int main()
{
B(1);
return 0;
}
結果報錯:[Error] class ‘B’ does not have any field named ‘n’
所以越級初始化是不可以的,但是可以“越級賦值”(自造名詞哈哈)
class B:public A{
public:
///B(int temp):n(temp){}
///改爲
B(int temp){n=temp};
};
這樣就可以完美運行了。
因此,派生類的構造函數必須通過調用基類的構造函數初始化基類成員,不能夠在派生類初始化列表直接初始化基類的成員