目錄
多態通過繼承層次結構來實現。
虛函數
參考上一篇的例子,通過Fish的指針或其引用來訪問Fish對象,這種指針或引用可指向Fish、Tuna或Carp對象。那麼我如果想要調用Swim(),那是調用的Tuna還是Carp的呢?這時候就需要用到了虛函數了:
這就是多態,將派生類對象視爲基類對象,並執行派生類的Swim()實現。
虛析構函數
對於使用new在自由存儲區中實例化的派生類對象,如果將其賦給基類指針,並通過該指針調用delete,將不會調用派生類的析構函數。這可能導致內存泄漏等問題,須將基類的析構函數聲明爲虛函數以避免。這樣就可以保證,如果該指針指向的是派生類所實例化的對象,則編譯器不僅會執行基類裏面的析構函數,還會執行派生類裏的析構函數,而且,無論派生類實例化對象是使用new在自由存儲區中實例化的,還是以局部變量的方式在棧中實例化的,構造函數和析構函數的調用順序都相同。
抽象基類和純虛函數
不能實例化的基類稱爲抽象基類,這樣的基類就是隻有一個用途,就是從它派生出其他類。如果要創建抽象基類,可聲明純虛函數。純虛函數對應的在派生類中就迫使派生類必須分別實現各自的對應純虛函數的函數功能了。這樣就提供了一種不錯的機制,來讓程序員能夠聲明所有派生類都必須實現的函數。如果a類從A類派生出來,但沒有實現a::與純虛函數同名的函數,將無法通過編譯。