虛擬函式和純虛擬函式
定義一個函式為虛擬函式,不代表這個函式時不被實現(例項化)的函式;定義它為虛擬函式,是為了允許用指向基類的指標來呼叫子類的這個函式(重定義的虛擬函式),定義一個函式為純虛擬函式才代表函沒有被實現(例項化)。
c++執行時的多型性是通過虛擬函式實現的,虛擬函式虛在“推遲聯編”或者“動態聯編”,虛擬函式並不是在編譯的時刻被確定的,而是在執行時刻被確定的。由於編寫程式碼的時候並不能確定被呼叫的是基類還是某一個派生類的函式,所以被稱為虛擬函式。可以通俗地理解為虛擬函式可以給我們提供多項選擇而不是單選 。虛擬函式通過 指標 或 引用 來實現多型的效果
純虛擬函式
在基類中宣告的虛擬函式,它在基類中沒有定義,但要求任何派生類都要 定義自己的實現方法(重定義)。
純虛擬函式引入的原因(主要從“虛”和“純”連個角度分析):
1.方便使用多型性,我們常常在基類中定義虛擬函式
2.在很多時候,基類本身例項化是沒有意義的。車類作為基類時,可以派生出私家車類、貨車類、巴士類、三輪車類、火車類、摩托車類、電動車類、自行車類等等。車類這個概念太廣太抽象,很難與具體的事物聯絡起來,例項化不合常理,而子類相對來說是具體的,私家車用來載人,貨車用來載物,各自有各自的功能,容易和現實聯絡起來。如果你例項了一個車類,車可以載人也可以載貨物,也可以用來騎,那這車就過於複雜了,這樣類就失去了意義。簡單來說,類是為了化繁為簡。
為了解決1和2兩個問題,引入了純虛擬函式的概念,將函式定義為純虛擬函式,則編譯器會要求在派生類中必須重寫以實現多型性。含有純虛擬函式的類是一個抽象類,抽象類不能例項化。在基類中宣告純虛擬函式就是為了告訴子類,我沒有具體的內容,你必須提供純虛擬函式的實現,重寫函式以實現自己想要的功能。