C++ 中繼承與動態內存分配的詳解
繼承是怎樣與動態內存分配進行互動的呢?例如,如果基類使用動態內存分配,并重新定義賦值和復制構造函數,這將怎樣影響派生類的實現呢?這個問題的答案取決于派生類的屬性。如果派生類也使用動態內存分配,那么就需要學習幾個新的小技巧。下面來看看這兩種情況:
一.派生類不使用new
派生類是否需要為顯示定義析構函數,復制構造函數和賦值操作符呢?
不需要!
首先,來看是否需要析構函數,如果沒有定義析構函數,編譯器將定義一個不執行任何操作的默認構造函數。實際上,派生類的默認構造函數總是要執行一些操作:執行自身的代碼后調用基類析構函數。因為我們假設派生類的成員不需要執行任何特殊操作,所以默認析構函數是合適的。
再看復制構造函數。默認復制構造函數執行成員復制,這對于動態內存分配來說是不合適的,但對于新的派生類的成員來說是合適的。因此只需要考慮繼承的基類的對象。要知道,成員復制將根據數據類型采用相應的復制方式,因此復制類成員或繼承的類組件時,則是使用該類的復制構造函數完成的。所以派生類的默認復制構造函數使用基類的顯示復制構造函數來復制派生類對象的基類成員部分。因此,默認復制構造函數對于新的派生類而言是合適的。
對于賦值來說,同樣道理。
二.派生類使用new。
如果派生類需要new操作,那么需要顯示定義析構函數,復制構造函數和賦值操作符。
派生類析構函數自動調用基類的構造函數,故其自身的職責是對派生類構造函數執行工作的進行清理。
接下來看復制構造函數:
1
2
3
4
|
DerivedClass::DerivedClass( const DerivedClass& de):BaseClass(de) { //....... } |
看賦值操作符:
1
2
3
4
5
6
|
DerivedClass::operator=( const DerivedClass& de) { if ( this == &de) return * this ; BaseClass::operator=(de); //.......... } |
總之,當基類和派生類都采用動態內存分配時,派生類的析構函數,復制構造函數以及賦值操作符都必須使用想用的基類方法來處理基類元素。這種要求是通過三種不同的方式來滿足的。
1.對于析構函數,這是自動完成的;
2.對于構造函數,這是通過在初始化成員列表中調用基類的復制構造函數來完成的;如果不是這樣做,將自動調用基類的默認構造函數。
3.對于復制操作符,這是通過使用作用域解析操作符顯示的調用基類的賦值操作符來完成了。
以上就是C++ 中繼承與動態內存分配的詳解,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/angelxf/article/details/7853139