C++知識點隨筆(四):耦合問題、new和malloc、虛析構、多繼承
一、耦合問題
即互相包含標頭檔案的問題,解決方法:
1. 在一個類的標頭檔案裡宣告另一個類,那麼我們在定義的時候就不能new物件,但是可以定義一個指標。這只是為了保證編譯通過,等到具體建立物件的時候還是會使用原來的類成員。
2. 可以抽象出一個父類,讓這個父類裡面同時包含這兩個子類裡需要耦合的部分。
3. friend方法,其實也相當於一個宣告,但是friend會破壞類的封裝性。(傳說中友元是不需要標頭檔案的)。
4. 降低耦合性參考:http://developer.178.com/200912/54167815997.html
二、new和malloc的區別
malloc只是在堆區申請空間;
而new裡面封裝了三件事情:
1. 呼叫類的建構函式
2. 在堆區申請空間
3. 返回物件的首地址
delete封裝了兩件事:
1. 呼叫解構函式
2. 刪除指標所指向的全部空間
注意:delete刪除空間時一定將new的物件大小全部刪除了,但是呼叫誰的析構就要看這個指標本身的型別了。所以當這種情況時:
CFather *son = new CSon;
delete son;
就不會呼叫子類的解構函式,從而可能會造成記憶體洩露。所以要解決這個問題,就有了我們後面的虛析構的誕生。
三、虛析構
虛析構就是當我們delete父類指標的時候,會首先呼叫子類的解構函式,然後再呼叫父類的解構函式,這樣就保證了所有的子類解構函式都可以呼叫,從而避免了記憶體洩露的問題。它的形式是這樣的:
virtual ~CFather();
什麼時候用虛析構呢?
有多型或者說有virtual的時候就用虛析構。這個虛析構同樣也存在於虛擬函式列表中,子類的解構函式會重寫這個表中的虛解構函式指標。注意:虛解構函式指標不一定就在虛擬函式列表的最後,它和普通虛擬函式一樣,是根據父類中宣告的順序加入虛擬函式列表的。
為什麼呼叫子類的解構函式之後一定會呼叫父類的解構函式?
我們之前講過,子類繼承父類的過程其實相當於在最開始的時候定義了一個父類的物件,那麼當我們執行完子類的解構函式之後,這個子類就要回收了,所以定義的父類的物件的作用域也就結束了,就會自動呼叫父類物件的解構函式了。
四、多繼承
多繼承形式:
class AA : public BB, public CC
多繼承的構造順序是:BB->CC->AA
多繼承的所以父類中,從左向右依次執行建構函式。
多繼承的缺點:
多繼承會出現訪問不明確的問題,因為多繼承是這樣的:
所以有兩份AA,這樣我們在使用AA的成員變數的時候就會發生訪問不明確的問題,解決的方法就是使用虛繼承,這個我們後面再講。
另外當我們多繼承的父類,即BB和CC同時擁有兩個同名的虛擬函式時,子類也無法將他們重寫,還是指向不明確的問題,這個問題我們可以通過巢狀類來解決,後面再講。
其實多繼承的出現本身就是一種缺陷,證明了我們的程式設計的不夠完美,所以我們在程式設計的時候儘量避免多繼承的出現。
相關文章
- C++知識點隨筆(五):虛繼承C++繼承
- C++ 虛擬函式和虛繼承淺析C++函式繼承
- C++知識點隨筆(六):模板C++
- new和malloc的地址分配問題
- C++ 繼承、多型、虛擬函式C++繼承多型函式
- C++中的虛繼承的構造C++繼承
- 【C++】 46_繼承中的構造與析構C++繼承
- C++知識點49——類繼承與類的構造、拷貝、operator=和解構函式C++繼承函式
- [c++] 繼承和多型整理二C++繼承多型
- C++虛繼承的概念C++繼承
- c++ 虛繼承詳解C++繼承
- Java零散知識點整理(二)(構造方法、繼承)Java構造方法繼承
- JS基礎-完美掌握繼承知識點JS繼承
- 知識盲點 隨筆筆記筆記
- 【c++基礎】菱形繼承問題C++繼承
- 淺析 Python 的類、繼承和多型Python繼承多型
- C++中new與malloc的10點區別C++
- 【odoo】【知識點】檢視的繼承邏輯Odoo繼承
- 菱形繼承,虛繼承繼承
- 繼承問題繼承
- C/C++——C++中new與malloc的10點區別C++
- C malloc() free(), C++ new() delete()C++delete
- C++單繼承、多繼承情況下的虛擬函式表分析C++繼承函式
- Python小知識點隨筆Python
- 【C++】C++ new和malloc到底哪裡不一樣C++
- 繼承和多型繼承多型
- 多型和繼承多型繼承
- C++,繼承,基類和派生類指標間賦值等知識C++繼承指標賦值
- 【Java學習筆記】繼承和多型Java筆記繼承多型
- C++多繼承的細節C++繼承
- 虛繼承繼承
- C++知識點隨筆(三):static、const、friend、inlineC++inline
- C/C++【知識點筆記】C++筆記
- C++學習筆記——C++ 繼承C++筆記繼承
- delegate 繼承問題繼承
- corejava基礎知識(1)-繼承Java繼承
- Objective c 知識總結 繼承Object繼承
- Java建構函式的繼承問題Java函式繼承