1. 封裝
- 封裝:隱藏對象的屬性和實現細節,僅對外公開接口和對象進行交互。
- 封裝性實際上是由編譯器去識別關鍵字public、private和protected,體現在類的成員可以有公有成員(public),私有成員(private),保護成員(protected)。
- 私有成員是在封裝體內被隱藏的部分,只有類的成員函數纔可以訪問私有成員,而在類體外的函數時不能訪問的;公有成員是封裝體與外界的一個接口,類體外的函數可以訪問公有成員;保護成員是隻有該類的成員函數和該類的派生類纔可以訪問的。
- 封裝的作用是:降低耦合。
2. 繼承
- 繼承是面向對象程序設計使代碼可以複用的最重要的手段,它允許程序員在保持原有類特性的基礎上進行擴展,增加功能,這樣產生新的類,稱派生類;
2.1 格式
//Person爲父類、基類,Student爲派生類、子類,public爲繼承方式
class Student : public Person
{
}
2.2 繼承方式
【基類成員在不同繼承方式下的訪問】
2.3 繼承中的作用域
- 在繼承體系中基類和派生類都有獨立的作用域;
- 子類和父類中有同名成員,子類成員將屏蔽父類對同名成員的直接訪問,這種情況叫隱藏,也叫重定義;
- 實際中在繼承體系裏面最好不要定義同名的成員。
2.4 菱形繼承
2.4.1 什麼是菱形繼承
- 菱形繼承是多繼承的一種特殊情況;
- 菱形繼承會有數據冗餘和二義性;
2.4.2 菱形虛擬繼承
- 虛擬繼承可解決菱形繼承的二義性和數據冗餘的問題。
- 爲什麼虛擬繼承可以解決這兩個問題:由於虛擬繼承中存在虛基表。
3. 多態
- 多態是在不同繼承關係的類對象,去調用同一函數,產生了不同的行爲;
【在繼承中構成多態的兩個條件】
- 必須通過基類的指針或者引用調用虛函數;
- 被調用的函數必須是虛函數,且派生類必須對基類的虛函數進行重寫。
【重載、重寫、重定義區別】
3.1 抽象類
- 包含純虛函數的類,抽象類也成爲接口類;
- 純虛函數:在虛函數的後面寫上 = 0 ,則這個函數爲純虛函數;
- 作用:要求派生類對虛函數進行重寫。
3.2 虛函數和虛函數表
- 虛函數:即被virtual修飾的類成員函數稱爲虛函數;
- 虛函數表本質是一個存虛函數指針的指針數組;
- 虛函數和虛函數表均在代碼段。