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