C 復合與繼承下的ctor和dtor順序

2022-05-18 13:42:07 字數 1085 閱讀 1840

了解到復合關係與繼承關係,我們知道了復合關係下:先構造內部,再構造外部

繼承關係下:先構造父類,再構造子類

那麼在既有復合關係,又有繼承關係的情況下,構造與析構的順序分別是怎樣呢,基於這個問題,寫一段簡單的**觀察。

#includeusing

namespace

std;

class

a ~a()

};class

b ~b()

};class c : public

a ~c()

};int

main()

執行結果如下:

abc

cba

可知,在復合關係與繼承關係同時存在時,先構造父類,再去構造派生類以及它的內部類,而析構順序則與構造順序剛好相反。

補充一下類物件的建立與釋放過程:

詳細說明:

類的建立過程

1、從堆疊中分配類所需要的空間。

2、根據需求傳遞或不傳遞引數呼叫建構函式,完成如下任務:

①根據繼承表依次呼叫父類的建構函式。

②根據成員變數的順序依次呼叫成員變數的建構函式。

③執行建構函式體中的**。

注意:執行建構函式的**是整個建構函式的最後一步,要保證建構函式**所需要的一切資源和先決條件在該**執行前已經準備充分,並得到正確的初始化。

類的釋放過程

析構函式負責釋放在建構函式期間獲取的所有資源,它的執行過程:

①先執行析構函式本身**

②呼叫成員類的析構函式

③呼叫父類的析構函式

如果乙個類沒實現析構函式,編譯器會自動生成乙個具有析構功能的二進位制指令,它負責釋放編譯器能夠看得到的資源(成員變數、類成員、父類成員),這就是預設析構。

如果類中沒有動態資源,也不需要做善後工作,預設析構就完全夠用了,不需要再定義新析構函式。

注意:預設析構無法釋放動態資源(堆記憶體)。

Objective C中的繼承與復合技術

學習了objective c中有關類繼承的知識。紀錄如下 1 oop程式設計中有兩個技術 用於描述類與類或物件與物件之間的關係 乙個是繼承 另乙個是復合。2 在objective c中每個子類只能有乙個超類,這一點與c 不同。3 方法排程程式 該排程程式的功能非常重要,當乙個物件接收到乙個訊息後,排...

C 物件導向程式設計之復合 委託和繼承

1.復合,表示has a template calss a這裡表示 a 裡面有乙個 b,a 可以呼叫 b 寫好了的功能函式,b 裡的東西可能更多更強大,a 只取其中一些用 復合關係下的構造和析構 1 構造是由內而外進行的,在上例中,a 的構造會先呼叫 b 的預設構造函式,再執行自己的。2 析構是由外...

資料結構 單鏈表(c 繼承和復合的形式實現)

includeusing namespace std class node class nodelist public node nodelist const node x nodelist const nodelist x void makeempty nodelist int length co...