定義基類
對于基類,我們需要記住的是作為繼承關系中根節點的類通常都會定義一個虛析構函數。
基類通常都會定義一個虛析構函數,即使該函數不執行任何實際操作也是如此。
成員函數和繼承
派生類可以繼承其基類的成員,也可以對基類中的虛函數進行重新定義。換句話說,派生類需要對這些操作提供自己的新定義以覆寫(override)從基類繼承而來的舊定義。
在C++語言中,基類必須将它的兩種成員函數區分開來:一種是基類希望其派生類進行覆寫的函數;另一種是基類希望派生類直接繼承而不要改變的函數。對于前者,基類通過将其定義為虛函數(virtual)。當我們使用指針或引用調用虛函數時,該調用将被動态綁定。根據引用或指針所綁定的對象類型不同,該調用可能執行基類的版本,也可能執行某個派生類的版本。
基類通過在其成員函數的聲明語句之前加上關鍵字virtual使得該函數執行動态綁定。任何構造函數之外的非靜态函數都可以是虛函數。關鍵字virtual隻能出現在類内部的聲明語句之前而不能用于類外部的函數定義。如果基類把一個函數聲明成虛函數,則該函數在派生類中隐式地也是虛函數。
成員函數如果沒有被聲明為虛函數,則其解析過程發生在編譯時而非運作時。
通路控制與繼承
派生類可以繼承定義在基類中的成員,但是派生類的成員函數不一定有權通路從基類繼承而來的成員。和其他基類的代碼一樣,派生類能通路公用成員,而不能通路私有成員。不過在某些時候基類中還有這樣一種成員,基類希望它的派生類有權通路該成員,同時禁止其他使用者通路。我們用受保護的(protected)通路運算符說明這樣的成員。
定義派生類