C++技術——多型、抽象類
一 多型相關知識點
1. 用基類的指標 或引用操縱多個型別 的能力被稱為多型,繼承, 得到派生類的指標或引用給父類, 父類有虛擬函式。
2.實現過程是: 用基類的指標類指向派生類的地址,在呼叫虛擬函式(因為呼叫虛擬函式是通
過查虛表執行函式的,但虛表中的虛擬函式指標可以在繼承的時候被子類覆蓋)。
3.在多型中會出現父類指標指向子類,那麼父類指標用完後會 delete,那麼這時候預設會調
用父類的虛構函式,如果子類中有記憶體要釋放,那就被洩露掉了,為了解決這問題就把基
類的解構函式設定為虛擬函式。
4 .如果虛擬函式在基類與派生類中出現,僅僅是名字相同,而形式引數不同,或者是返回型別不同,那麼即使加上了virtual關鍵字,也是不會進行滯後聯編的。
5. 只有類的成員函式才能說明為虛擬函式,因為虛擬函式僅適合用與有繼承關係的類物件,所以普通函式不能說明為虛擬函式。
6. 靜態成員函式不能是虛擬函式,因為靜態成員函式的特點是不受限制於某個物件。
7. 內聯(inline)函式不能是虛擬函式,因為行內函數不能在執行中動態確定位置。即使虛擬函式在類的內部定義定義,但是在編譯的時候系統仍然將它看做是非內聯的。
8. 建構函式不能是虛擬函式,因為構造的時候,物件還是一片位定型的空間,只有構造完成後,物件才是具體類的例項。
9. 解構函式可以是虛擬函式,而且通常聲名為虛擬函式。
二 抽象類
1. 純虛擬函式並不需要實現,如果一個類中的有純虛擬函式那麼這個類就是抽象類
什麼情況下使用純虛擬函式:
在基類本身生成物件是不合情理的時候,
比如:動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常
理。為了解決這個問題,方便使用類的多型性,引入了純虛擬函式的概念,將函式定義為純
虛擬函式(方法:virtual 函式返回型別 函式名()= 0;),則編譯器要求在派生類中必須予以
重寫以實現多型性。同時含有純虛擬函式的類稱為抽象類,它不能生成物件。
2. 應用場景:專案負責人一般可以建立一個抽象類,每個功能函式都宣告為純虛擬函式,接下程式設計師根據這個抽象類重寫每個
純虛擬函式,這樣專案負責人和專案小組成員可以很好形成溝通。
三 知識擴充:概念的區別:即過載,重寫(覆蓋),以及重定義(同名隱藏)
1.過載是指在同一作用域中允許有多個同名函式,而這些函式的引數列表不同,包括引數個數不同,型別不同,次序不同,需要注意的是返回值相同與否並不影響是否過載。
2.重寫(覆蓋)和重定義(同名隱藏)則有點像,區別就是在寫重寫的函式是否是虛擬函式,只有重寫了虛擬函式的才能算作是體現了C++多型性,否則即為重定義,在之前的程式碼中,我們看到子類繼承了基類的fun()函式,若是子類沒有fun函式,依舊會呼叫基類的fun函式,若是子類已重定義,則呼叫自己的fun函式,這就叫做同名隱藏,當然此時如果還想呼叫基類的fun函式,只需在呼叫fun函式前加基類和作用域限定符
3. 用表圖表示關係: