虛擬函式 純虛擬函式

馬小超i發表於2020-12-11

首先:強調一個概念
定義一個函式為虛擬函式,不代表函式為不被實現的函式。

定義他為虛擬函式是為了允許用基類的指標來呼叫子類的這個函式。

定義一個函式為純虛擬函式,才代表函式沒有被實現。

定義純虛擬函式是為了實現一個介面,起到一個規範的作用,規範繼承這個類的程式設計師必須實現這個函式。



作者:wuxinliulei
連結:https://www.zhihu.com/question/23971699/answer/69592611
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

https://blog.csdn.net/Ferlan/article/details/82856536

 

https://mp.weixin.qq.com/s?__biz=MzAxNzYzMTU0Ng==&mid=2651289202&idx=1&sn=431ffd1fae4823366a50b68aed2838d4&chksm=80114627b766cf31f72018ef5f1fe29591e9f6f4bd72018e7aea849342ca6f0a271fb38465ae#rd

子類如果不提供虛擬函式的實現,那就會自動呼叫基類的預設方案。而子類如果不提供純虛擬函式的實現,則編譯將會失敗。

基類提供的純虛擬函式實現版本,無法通過指向子類物件的基類型別指標或引用來呼叫,因此不能作為子類相應虛擬函式的備選方案

 

用一個基類型別的指標或者引用,來指向子類物件,進而呼叫經由子類複寫了的個性化的虛擬函式,這是C++實現多型性的一個最經典的場景

 

純虛擬函式在基類中的實現跟多型性無關,它只是提供了一種語法上的便利,在變化多端的應用場景中留有後路

 

第五,虛擬函式和普通的函式實際上是儲存在不同的區域的,虛擬函式所在的區域是可被覆蓋(也稱複寫override)的,每當子類定義相同名稱的虛擬函式時就將原來基類的版本給覆蓋了,另一側面也說明了為什麼基類中宣告的虛擬函式在後代類中不需要另加宣告一律自動為虛擬函式,因為它所儲存的位置不會發生改變。而普通函式的儲存區域不會覆蓋,每個類都有自己獨立的區域互不相干。

相關文章