假設基類使用動態記憶體分配,並重新定義了賦值和複製建構函式
class class_a;
宣告中包含了建構函式使用new時需要的特殊方法:析構函式、複製建構函式和過載賦值操作符。詳情檢視《關於類隱式成員函式》
當派生類使用new
class class_b:public class_a;
這種情況下,必須為派生類定義顯示析構函式、複製建構函式和賦值操作符。
1.析構函式
派生類析構函式自動呼叫基類的析構函式,故其自身的職責是對派生類建構函式執行工作的進行清理。因此,class_b析構函式必須釋放指標 b 管理的記憶體,並依賴於class_a的析構函式來釋放指標 a 管理的記憶體。
class_a::~class_a()
class_b::~class_b()
2.複製建構函式
基類定義的複製建構函式如下:
class_a(const class_a & rs)
由於class_b的複製建構函式只能訪問class_b的資料,因此它必須呼叫class_a的複製建構函式來處理共享的class_a資料:
class_b::class_b(const class_b & hs):class_a(hs)
3.賦值操作符
基類定義的賦值操作符如下:
class_a & class_a::operator= (const class_a & rs)
派生類的顯示賦值操作符必須負責所有繼承的class_a基類物件的賦值,可以通過顯示呼叫基類賦值操作符來完成:
class_b & class_a::operator= (const class_b & hs)
class_a::operator=(hs) 使用函式表示法,而不是操作符表示法,可以使用作用域解析操作符,從而使得賦值操作符被正確的呼叫。
當基類和派生類都採用動態記憶體分配時,派生類的析構函式、複製析構函式以及賦值操作符都必須使用相應的基類方法來處理基類元素。對於析構函式,這是自動完成的;對於複製建構函式,這是通過在初始化成員列表中呼叫基類的複製建構函式來完成的;如果不這樣做,將自動呼叫基類的預設建構函式。對於賦值操作符,是通過使用作用域解析操作符顯示地呼叫基類的賦值操作符來完成的。
繼承與動態記憶體分配
在基類或派生類中含有指標時,要考慮記憶體分配情況 new與delete 還要考慮在進行物件間賦值時指標隱藏的問題 使用預設複製建構函式在析構時會造成原物件中的指標指向的記憶體空間被釋放,為淺複製 因此需要 1.過載運算子 實現深度複製 2.在建構函式中使用new進行動態記憶體分配,在析構函式中使用d...
C 之繼承和動態記憶體分配
c 之繼承和動態記憶體分配 如果基類使用動態記憶體分配,並重新定義賦值和複製建構函式,這將如何影響派生類的實現呢?這取決於派生類的屬性,如果派生類也使用動態記憶體分配,這將如何實現呢?這種大致分為兩種情況,第一種情況 派生類不使用new 這將不需要在派生類中顯式的定義析構函式,複製建構函式,賦值操作...
C之動態記憶體分配
在編寫程式時,通常並不知道需要處理的資料量,或者難以評估所需處理資料量的變動程度。在這種情況下,要達到有效的資源利用,必須在執行時動態地分配所需記憶體,並在使用完畢後盡早釋放不需要的記憶體,這就是動態記憶體管理原理。參考文章 1 c語言動態記憶體管理和動態記憶體分配 標準庫stdlib.h提供以下四...