1、組合與繼承
組合關系:不破壞封裝,整體類與局部類之間松耦合,彼此相對獨立。具有較好的可擴展性。支持動態組合。在運行時,整體對象可以選擇不同類型的局部對象。整體類可以對局部類進行包裝,封裝局部類的接口,提供新的接口。整體類不能自動獲得和局部類同樣的接口。創建整體類的對象時,需要創建所有局部類的對象。
繼承關系:破壞封裝,子類與父類之間緊密耦合,子類依賴于父類的實現,子類缺乏獨立性。支持擴展,但是往往以增加系統結構的復雜度為代價。不支持動態繼承。在運行時,子類無法選擇不同的父類。子類不能改變父類的接口。子類能自動繼承父類的接口。創建子類的對象時,無須創建父類的對象。
2、虛函數與多態
? ? 當對某個虛函數通過指針或引用調用時,編譯器產生的代碼直到運行時才能確定應該調用哪個版本的函數。被調用的函數是與綁定到指針或引用上的對象的動態類型相匹配的那一個。
? ? OOP的核心思想是多態性。多態性這個詞源自希臘語,其含義是“多種形式”。我們把具有繼承關系的多個類型稱為多態類型,因為我們能使用這些類型的“多種形式”而無需在意它們的差異。引用或指針的靜態類型與動態類型不同這一事實正是C++語言支持多態性的根本所在。
? ? 當我們使用基類的引用或指針調用基類中定義的一個函數時,我們并不知道該函數真正作用的對象是什么類型,因為它可能是一個基類的對象也可能是一個派生類的對象。如果該函數是虛函數,則直到運行時才會決定到底執行哪個版本,判斷的依據是引用或指針所綁定的對象的真實類型。