在c++的單繼承中,建構函式有3個需要呼叫的地方
基類建構函式
子物件建構函式
派生類本身的建構函式
呼叫的順序為:
呼叫基類建構函式,對基類資料成員初始化
呼叫子物件建構函式,對子物件資料成員初始化
呼叫派生類建構函式,對派生類資料成員初始化
基類和派生類的建構函式相信不用多說了,前者優先於後者,需要注意的是這裡面的子物件的建構函式。
注意:在每乙個類中,不管他是基類還是派生類,子物件的建構函式的呼叫都優先於此類本身的構造函式呼叫
只要搞清楚了建構函式的順序,一但遇到了析構函式,只要把建構函式反過來看,就是析構函式的呼叫順序了。
實驗**如下:
#include
using
namespace std;
class
d// 實驗的子物件類~d
()};
class
e// 實驗的子物件類~e
()};
classa~
a()//d d;
//e e;};
classb:
public a~b
()//d d;
//e e;};
classc:
public b~c
()d d;
e e;};
intmain()
執行結果如下:
注意:在每個類中,如果有多個子物件,那麼他們建構函式的呼叫順序取決於他們的宣告順序,宣告越早,構造越早。如上面**中在類c中子物件d, e的構造函式呼叫,因為d的宣告在e之前,所以的d的建構函式先呼叫
現在將兩個子物件放到類b中
#include
using
namespace std;
classd~
d()}
;classe~
e()}
;classa~
a()//d d;
//e e;};
classb:
public a~b
()d d;
e e;};
classc:
public b~c
()//d d;
//e e;};
intmain()
執行結果如下:
下面將子物件放到類a中:
#include
using
namespace std;
classd~
d()}
;classe~
e()}
;classa~
a() d d;
e e;};
classb:
public a~b
()//d d;
//e e;};
classc:
public b~c
()//d d;
//e e;};
intmain()
執行結果如下: 繼承中建構函式與析構函式
include using namespace std class y y int ii i ii class x public y 這個是繼承,在繼承的時候,x 類中含有的函式與y 函式相同,則將y類的此函式遮蔽掉,無論引數是否相同,只要函式一樣就將其遮蔽掉,class base1 base1 c...
C 繼承中的建構函式和析構函式
1 繼承中建構函式和析構函式呼叫順序 a 呼叫父類建構函式 b 呼叫其他成員的建構函式 c 呼叫子類建構函式 d 析構呼叫順序相反。include using namespace std class base public base cout base中的預設構造函式呼叫 2 子類預設呼叫父類的預設...
C 中建構函式與析構函式
建構函式主要功能 在建立物件的時候,給物件變數賦值。析構函式主要功能 當物件脫離其作用域時 例如物件所在的函式已呼叫完畢 系統自動執行析構函式,在此物件撤銷的時候釋放所占用的資源 在建立乙個類的物件時,首先呼叫建構函式對這個物件進行初始化。當這個物件的生命週期結束時,呼叫析構函式。例如,定義了乙個類...