空的虛擬函式與純虛擬函式的區別
純虛擬函式適用於兩種情況
a) 介面類情況,在介面類情況下,不允許類內部包含任何實現,常見的是在DLL中包裝一個實現,而通過純虛類提供介面。在這種情況下,介面只告訴使用者有那些方法可以用,而不在類中提供任何實現。不提供實現的好處在於,對於一個純虛擬函式,使用dll的程式不需要找到對應的符號表,不需要連結那個dll對應的lib,只要標頭檔案即可
b) 基類希望每個派生類必須實現一個方法。例如你寫一個GetInstanceType方法,你希望每種派生類都必須提供這個方法,如果你寫了一個空的虛擬函式,編譯器不會幫你去強迫派生類實現
空的虛擬函式適用於派生類可以也可以不實現的情況。一般是對於同一個基類的不同派生類,他們提供的功能可能是不一樣的,因此一些虛擬函式不是必須被實現
例如我們寫一個數據庫訪問類,提供一對Lock/Unlock函式。但是兩個派生類中,一個是訪問不支援多連結的資料庫,根本不需要上鎖,而另外一個訪問基於多個連結的資料庫,需要隨時上鎖。但是如果我們在基類中如果不提供Lock/Unlock,使用這個類的客戶端就需要了解派生類是什麼,然後選擇是否呼叫Lock/Unlock,這就違背了封裝原則