繼承和動態內存分配

兩種情況
一 派生類不使用new
二 派生類使用new

派生類不使用 new

前提 : 基類使用了new,派生類不使用 new

結果 : 不需要給派生類定義顯式的析構函數,複製構造函數,賦值運算符.

原因:

析構函數: 派生類的默認析構函數進行的操作: 執行自身的代碼後調用基類析構函數. 因爲派生類 不使用 new,則派生類的構造函數 不需要執行任何特殊的操作,所以 默認析構函數 ok.

複製構造函數:
對派生類: 默認複製構造函數只進行成員的複製,不會 new 新的空間,而此時派生類 不需要 new空間,所以 對派生類是合適的.
對基類: 複製類成員或繼承的類組件時,使用的是該類複製構造函數完成的.即 在此時使用的是 基類的複製構造函數.
即 : 默認的複製構造函數 ok.

賦值運算符:
對派生類: 由於不需要 new 空間,所以默認的賦值運算符 ok.
對基類: 當對基類組件賦值時,派生類的默認賦值運算符將自動使用基類的賦值運算符.
即: 默認的賦值運算符 也 ok.

綜上所述: 當派生類 不使用 new是, 不需要給派生類定義顯式的析構函數,複製構造函數, 賦值運算符.

派生類使用 new

前提 : 基類使用了 new,派生類也使用了 new

結果 : 需要給派生類定義顯式的析構函數,複製構造函數,賦值運算符.

原因:

析構函數: 由上知,默認的析構函數在操作完成後,自動調用基類的析構函數. 但 派生類本身 new 的空間還沒有釋放,造成內存泄露. 即: 需要定義派生類本身的 析構函數,用來釋放派生類的構造函數 new 的空間.

複製構造函數:
對派生類:默認的複製構造函數 只能進行成員的複製,不會new 空間,所以需要定義複製構造函數.
對基類: 同上.
即: 需要定義派生類本身的 複製構造函數,用來進行空間複製,而不是簡單的成員複製
定義派生類的複製構造函數時, 可以通過使用基類的複製構造函數 來處理 共享的基類數據.

賦值構造函數:
對派生類: 由於默認的賦值構造函數不能new 空間,所以需要定義賦值構造函數.
對基類: 同上.

在寫 賦值構造函數時: 用於派生類 不能處理 基類的數據,可以通過 顯式調用 基類賦值運算符處理 基類的數據.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章