C 之繼承和動態記憶體分配

2021-06-21 09:57:40 字數 1297 閱讀 1391

c++之繼承和動態記憶體分配

如果基類使用動態記憶體分配,並重新定義賦值和複製建構函式,這將如何影響派生類的實現呢?這取決於派生類的屬性,如果派生類也使用動態記憶體分配,這將如何實現呢?這種大致分為兩種情況,

第一種情況:派生類不使用new

這將不需要在派生類中顯式的定義析構函式,複製建構函式,賦值操作符。如果在派生類中沒有定義析構函式,編譯器將定義乙個不執行任何操作的預設建構函式,實際上,派生類的預設建構函式總要進行一些操作:執行自身的**後呼叫基類析構函式。因為派生類沒有任何特殊操作,所以使用預設析構函式是合適的。

接下來看複製建構函式,預設複製建構函式執行成員複製,這對於動態記憶體分配來說是不合適的,但對於派生類成員來說是合適的,因此只需要考慮繼承的基類物件,成員複製將根據資料型別採用相應的複製方式,複製類成員或者整合的類元件的時候,則是使用該類的複製建構函式完成的。所以,派生類的預設複製建構函式使用顯式基類複製建構函式來複製派生類物件的基類部分。因此,預設複製建構函式對於新的派生類成員來說是合適的,同時對於繼承的基類物件來說也是合適的。

對於賦值來說,累的預設賦值操作符將自動使用基類的賦值操作符來對基類元件進行賦值。因此,預設的賦值操作符也是合適的。

派生類物件的這些屬性也適用於本身是物件的類成員。

第二種情況:派生類使用new

在這種情況下,必須為派生類定義顯式析構函式,賦值操作符,複製建構函式。

派生類析構函式自動呼叫基類的析構函式,所以他自身的職責是對派生類建構函式執行工作進行清理。因此,派生類析構函式必須釋放為變數動態分配的記憶體,並依賴於基類的析構函式來釋放為基類變數動態分配的記憶體。

派生類的複製建構函式只能訪問派生類的資料,因此它必須呼叫基類複製建構函式來處理共享的基類資料。需要注意的是,成員初始化列表將乙個派生類引用傳遞給基類建構函式,沒有引數型別為派生類引用的基類建構函式,也不需要這樣的建構函式。因為基類的複製建構函式有乙個基類的引用引數,而基類引用可以指向派生型別。因此,基類複製建構函式將使用派生類引數的基類部分來構造新物件的基類部分。

接下來看賦值操作符,由於派生類也使用動態記憶體分配,所以它也需要乙個顯式賦值操作符。作為派生類的方法,它只能直接訪問派生類的資料,然而,派生類的顯式複製操作符必須負責所有繼承的基類物件的複製,可以通過顯式呼叫基類賦值操作符來完成這項工作。

總之,當基類和派生類都採用動態記憶體分配的時候,派生類的析構函式,複製建構函式以及賦值操作符都必須使用相應的基類方法來處理基類元素。這種要求是通過三種不同的方式來滿足的,對於析構函式,這是自動完成的;對於建構函式,這是通過在初始化成員列表中呼叫基類的複製建構函式來完成的,如果不這樣做,將自動呼叫基類的預設建構函式,對於賦值操作符,這是通過使用作用域操作符顯式的呼叫基類的賦值操作符來完成的。

繼承 之 動態記憶體分配

假設基類使用動態記憶體分配,並重新定義了賦值和複製建構函式 class class a 宣告中包含了建構函式使用new時需要的特殊方法 析構函式 複製建構函式和過載賦值操作符。詳情檢視 關於類隱式成員函式 當派生類使用new class class b public class a 這種情況下,必須...

C之動態記憶體分配

在編寫程式時,通常並不知道需要處理的資料量,或者難以評估所需處理資料量的變動程度。在這種情況下,要達到有效的資源利用,必須在執行時動態地分配所需記憶體,並在使用完畢後盡早釋放不需要的記憶體,這就是動態記憶體管理原理。參考文章 1 c語言動態記憶體管理和動態記憶體分配 標準庫stdlib.h提供以下四...

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...