C 繼承中的構造和析構

2022-08-18 10:21:10 字數 3269 閱讀 6188

1,構造:物件在建立的後所要做的一系列初始化的工作;

析構:物件在摧毀之前所要做的一系列清理工作;

2,思考:

1,子類中如何初始化父類成員?

1,對於繼承而言,子類可以獲得父類的**,可以獲得父類中的成員變數,成員變數從父類中傳遞到子類,那麼子類物件在建立的時候如何初始化從父類中繼承的成員變數呢?

2,父類建構函式和子類建構函式有有什麼關係?  

3,子類物件的構造:

1,子類中可以定義建構函式;

1,子類中定義的新的建構函式,對於子類物件建立的時候必須完成一系列的初始化工作,這些初始化工作包括初始化繼承而來的成員,第一種方式直接對他們進行賦值或者直接將他們寫到初始化列表中去進行初始化,第二種方式更直接,在子類構造的時候我們呼叫父類建構函式進行初始化;

2,這就是子類建構函式可以用來初始化父類成員的兩種方式;

2,子類建構函式:

1,必須對繼承而來的成員進行初始化;

1,直接通過初始化列表或者賦值的方式進行初始化;

1,有可能從父類中繼承了 private 成員,因此直接來進行賦值或初始化根本就是行不通的,因此這個時候只能通過父類的建構函式來進行初始化的工作;

2,呼叫父類建構函式進行初始化;

3,父類建構函式在子類中的呼叫方式;

1,預設呼叫:

1,子類物件在建立的時候會自動的呼叫父類的建構函式;

2,適用於無參建構函式和使用預設引數的建構函式;

1,對於需要引數的建構函式來說,預設的呼叫方式是行不通的,必須顯示呼叫;     

2,顯示呼叫:

1,通過初始化列表進行呼叫;

1,只能在初始化列表中呼叫;

2,適用於所有父類建構函式;

3,父類建構函式的呼叫:

1,**示例:

1

class child : public

parent28

9 child(string s) : parent(「parameter to parent」) /*

顯示呼叫

*/10

13};

4,子類的構造初探程式設計實驗:

1 #include 2 #include 34

using

namespace

std;56

class

parent 713

14 parent(string

s)15

18};

1920

class child : public

parent

2127

28 child(string s) //

隱式呼叫父類建構函式中的無參或缺省初始值建構函式;

2932

33 child(string s): parent(s) //

顯示呼叫父類建構函式;

3437

};38

39int

main()

40

1,子類和父類的建構函式的呼叫都嚴格按照過載規則呼叫;

5,子類物件的構造:

1,構造規則:

1,子類物件在建立時會首先呼叫父類的建構函式(要以子類構造函式呼叫為依據);

2,先執行父類建構函式再執行子類建構函式;

3,父類建構函式可以被隱式呼叫或者顯示呼叫;

2,物件建立時建構函式的呼叫順序:

1,呼叫父類的建構函式;

2,呼叫成員變數的建構函式;

3,呼叫類自身的建構函式;

4,口訣:

1,先父母(調到最上的父母為止),後客人(按照成員變數申明的順序),再自己;

2,非常實用;

3,子類構造深度解析程式設計實驗:

1 #include 2 #include 34

using

namespace

std;56

class

object713

};14

15class parent : public

object

1622

23 parent(string s) : object(s) //

必須顯示呼叫

2427

};28

29class child : public

parent

3039

40 child(string s) : parent(s), mo1(s + "

1"), mo2(s + "

2") //

父母和成員客人的區別在於父母建構函式直接呼叫,客人建構函式通過物件呼叫;

4144

};45

46int

main()

47

6,子類物件的析構:

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

1,執行自身的析構函式;

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

3,執行父類的析構函式;

2,物件的析構程式設計實驗:

1 #include 2 #include 34

using

namespace

std;56

class

object716

17 ~object()

1821

};22

23class parent : public

object

2433

34 parent(string

s) : object(s)

3539

40 ~parent()

4144

};45

46class child : public

parent

4758

59 child(string s) : parent(s), mo1(s + "

1"), mo2(s + "2"

)606465 ~child()

6669

};70

71int

main()

72

7,小結:

1,子類物件在建立時需要呼叫父類建構函式進行初始化;

2,先執行父類建構函式然後執行成員的析構函式;

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

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

5,析構順序與構造順序對稱相反;

1,先自己,後客人,再父母;

C 繼承中的構造和析構

在c 的繼承中,在子類物件構造時,需要呼叫父類建構函式對其繼承來的成員進行初始化,在子類進行析構時,需要呼叫父類的析構函式對其繼承來的成員進行清理,過程如下 1 子類物件在建立時會首先呼叫父類的建構函式 2 父類建構函式執行結束後,執行子類的建構函式 3 當父類的建構函式有引數時,需要在子類的初始化...

C 繼承中的構造和析構

先 呼叫父類建構函式 在呼叫 子類建構函式 析構的順序 和構造相反 1 子類物件在建立時會首先呼叫父類的建構函式 2 父類建構函式執行結束後,執行子類的建構函式 3 當父類的建構函式有引數時,需要在子類的初始化列表中顯示呼叫 4 析構函式呼叫的先後順序與建構函式相反 class parent par...

繼承中的構造和析構

子類的建構函式必須對繼承而來的成員進行初始化 1.直接通過初始化列表或者賦值的方式進行初始 2.呼叫父類建構函式進行初始化 父類建構函式在子類中的呼叫方式 1.預設呼叫.適用無參建構函式和使用預設引數的建構函式 2.顯示呼叫.通過初始化列表進行呼叫,適用於所有父類的建構函式 例子 class chi...