子類構造函數必須對繼承的成員進行初始化:
1. 通過初始化列表或則賦值的方式進行初始化(子類無法訪問父類私有成員)
2. 調用父類構造函數進行初始化
2.1 隱式調用:子類在被創建時自動調用父類構造函數(只能調用父類的無參構造函數和使用默認參數的構造函數)
2.2 顯示調用:在含參構造函數的初始化列表調用父類構造函數(適用所有的父類構造函數)
#include <iostream> #include <string> using namespace std; class PParent //父父類 { public: PParent(string s) { cout << "PParent" << s << endl; } ~PParent() { cout << "~PParent" << s << endl; } }; class Parent : public PParent // 父類 { public: Parent() : PParent("Default") { cout << "Parent" << endl; } Parent(string s) : PParent(s) { cout << "Parent" << s << endl; } ~Parent() { cout << "~Parent" << endl; } }; class sib_child // 同級類 { public: sib_child() { cout << "sib_child" << endl; } sib_child(string s) { cout << "sib_child" << s << endl; } ~sib_child() { cout << "~sib_child" << endl; } }; class Child : public Parent // 自己 { Parent p; sib_child sc; public: Child() : Parent(s),sib_child(s) { cout << "Child" << endl; } Child(string s) : Parent(s), sib_child(s) // 先調用父類構造函數,再調用同類構造函數 { cout << "Child" << s << endl; } ~Child() { cout << "~Child" << endl; } }; int main() { Child cc("call : "); // 構造順序 // PParent : call 父父類 // Parent : call 父類 // sib_child : call 同類 // Child : call 自己 return 0; // 析構順序 // ~Child : call 自己 // ~sib_child : call 同類 // ~Parent : call 父類 // ~PParent : call 父父類 }
構造函數調用順序:
1. 執行父類構造函數
2. 執行同級構造函數
3. 執行自己構造函數
析構函數調用順序:
1. 執行自己析構函數
2. 執行同級析構函數
3. 執行父類析構函數