C 繼承中的構造與析構 父子間的衝突

2021-09-27 05:28:53 字數 2871 閱讀 6801

q:如何初始化父類成員?父類建構函式與子類建構函式由什麼關係?

a.子類物件的構造

1.子類在可以定義建構函式

2.子類建構函式--必須對繼承而來的成員程序初始化(直接通過初始化列表或者賦值的方式進行初始化,呼叫父類建構函式進行初始化)

b.父類建構函式在子類中的呼叫方式

1.預設呼叫--適用於無參建構函式和使用預設引數的建構函式

2.顯示呼叫--通過初始化列表進行呼叫,適用於所有父類建構函式

**示例

#include #include using namespace std;

class parent

parent(string s)

};class child : public parent

child(string s) : parent(s)//對父類建構函式進行顯示呼叫

};int main()

執行結果如圖所示

由該示例和執行結果可以對構造規則進行乙個總結:子類物件在建立時首先會呼叫父類的建構函式,先執行父類建構函式在執行子類的建構函式,父類建構函式可以被隱式呼叫或者顯示呼叫

子類物件的構造:1.呼叫父類的建構函式2.呼叫成員變數的建構函式3.呼叫類自身的建構函式

子類構造深度解析

#include #include using namespace std;

class object

};class parent : public object

parent(string s) : object(s)

};class child : public parent

child(string s) : parent(s), mo1(s + " 1"), mo2(s + " 2")

};int main()

執行結果

object mo1 object mo2是組合關係,要對父類進行顯式的呼叫,該列印結果與上面所提的構造順序是相符的

c.子類物件的析構

析構函式的呼叫順序與建構函式相反

1.執行自身的析構函式

2.執行成員變數的析構函式

3.執行父類的析構函式

**示例

#include #include using namespace std;

class object

~object()

};class parent : public object

parent(string s) : object(s)

~parent()

};class child : public parent

child(string s) : parent(s), mo1(s + " 1"), mo2(s + " 2")

~child()

};int main()

執行結果

小結:1.子類物件在建立時需要呼叫父類建構函式進行初始化

2.先執行父類建構函式然後執行成員的建構函式

3.父類建構函式顯示呼叫需要在初始化列表中進行

4.子類物件在銷毀時需要呼叫父類析構函式進行清理

5.析構函式與建構函式對稱相反

q:子類中是否可以定義父類的同名成員?如果可以?怎樣區分?如果不行,為什麼?

**示例

#include #include using namespace std;

class parent

;class child : public parent

;int main()

namespace b

class parent

};class child : public parent

};int main()

執行結果

可以從該段**的執行結果看出,通過位址值可以很清楚得看出,父類與子類到底呼叫的是哪個

b:再論過載

類中的成員函式可以進行過載

1.過載函式的本質為多個不同的函式

2.函式名域引數列表是唯一的標識

3.函式過載必須發生在同一作用域中

父子間函式過載實驗

**示例及執行結果

父子間的衝突

1.子類中的函式將隱藏父類的同名函式

2.子類無法過載父類中的成員函式

3.使用作用域分辨符訪問父類中的同名函式

4.子類可以定義父類中完全相同的成員函式

c 繼承中的構造與析構

問題 如何初始化父類成員?父類與子類的建構函式的關係?在子類物件構造時,需要呼叫父類建構函式對其繼承得來的成員進行初始化。在子類物件析構時,需要呼叫父類析構函式對其繼承得來的成員進行清理。繼承中的構造與析構呼叫規則 1.子類物件在建立時會首先呼叫父類的建構函式 2.父類建構函式執行結束後,執行子類的...

繼承中的構造與析構

賦值相容性原則 子類物件可以當作父類物件使用 子類物件可以直接賦值給父類物件 子類物件可以直接初始化父類物件 父類指標可以直接指向子類物件 父類引用可以直接引用子類物件 子類是就是特殊的父類!class child public parent int main int argc,char argv ...

C 繼承的構造與析構

父類建構函式在子類中的呼叫方式 顯示呼叫 父類建構函式的呼叫 class child public parent 顯示呼叫 child string s parent parameter to parent 舉個例子 include include using namespace std class...