繼承中的構造和析構

2021-10-03 20:25:10 字數 3183 閱讀 5942

子類的建構函式必須對繼承而來的成員進行初始化

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

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

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

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

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

例子:

class

child

:public parent

child

(string s)

:parent

("parameter to parent"

)/*顯示呼叫,通過初始化列表進行呼叫*/

}

看下面這個例子:

#include

#include

using

namespace std;

class

parent

parent

(string s)};

class

child

: parent

child

(string s)};

intmain()

結果:

parent (

)child(

)parent (

)child(string s): c1

因為child c,child c1(「c1」)都是隱式呼叫,呼叫父類無參建構函式或者預設引數的建構函式,而父類中只有parent()這個無參建構函式,所以先呼叫父類的無參建構函式再呼叫本類的建構函式

**改動:

class

child

: parent

child

(string s)

:parent

(s)}

;

結果:

sice@sice:~$ ./a.out 

parent (

)child(

)parent(string s)c1

child(string s): c1

現在 child c1(「c1」)成了顯示呼叫,所以呼叫了父類的引數一致的建構函式,現在我們可以得出一套構造規則

構造規則:

子類物件在建立時會首先呼叫父類的建構函式

先執行父類建構函式再執行子類的建構函式

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

補充:物件建立時建構函式的呼叫順序

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")};

intmain()

結果:

sice@sice:~$ ./a.out 

object (string s)c1

parent(string s)c1

object (string s)c11

object (string s)c12

child(string s): c1

可以看出父類的呼叫最先,就是parent的建構函式,接著"客人"mo1(s + 「1」),mo2( s + 「2」),最後是自己的建構函式

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

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()

};intmain()

object(string s)

: cc

parent(string s)

: cc

object(string s)

: cc 1

object(string s)

: cc 2

child(string s)

: cc

~child(

) cc

~object(

): cc 2

~object(

): cc 1

~parent(

): cc

~object(

): cc

可以看出析構順序與構造順序對稱相反

要點:

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

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

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

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

繼承中構造析構

在繼承中面臨乙個問題就是 我們的基類和派生類都有各自的建構函式和析構函式,那麼再例項化派生類成員的時候,這個構造析構的順序是怎麼樣的呢?class animal animal void setm int a 0 intgetage private int age 我們構造了個動物類,我們需要繼續構造...

繼承中的構造和析構函式

子類物件在建立時首先會呼叫父類的建構函式,在父類的建構函式執行結束後,再執行子類的建構函式。當父類的建構函式有引數時,需要在子類的初始化列表中顯示呼叫。析構函式的呼叫的先後順序與建構函式相反 結論 建構函式 先呼叫父類 再呼叫子類 析構函式 先呼叫子類 再呼叫父類 如下所示 include usin...

C 繼承中的構造和析構

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