答案 「調用非虛擬函數將使用功能的同一類的指針類型,無論對象是一些其他派生類型實際創建的。而調用虛函數無論使用什麼樣的指針,都可以使用原始分配的對象類型中的函數。「 對我來說是最好的問題鏈接 What are the differences between overriding virtual functions and hiding non-virtual functions?優勢虛擬功能
但是,我仍然沒有看到使虛擬功能的好處。爲什麼不把它具體化並在必要時重寫該函數?
答案 「調用非虛擬函數將使用功能的同一類的指針類型,無論對象是一些其他派生類型實際創建的。而調用虛函數無論使用什麼樣的指針,都可以使用原始分配的對象類型中的函數。「 對我來說是最好的問題鏈接 What are the differences between overriding virtual functions and hiding non-virtual functions?優勢虛擬功能
但是,我仍然沒有看到使虛擬功能的好處。爲什麼不把它具體化並在必要時重寫該函數?
所有在您的鏈接的答案是相當複雜的,因爲他們實際上回答的問題比居然問:-)
我試圖使它更容易(可以自求多福):
概念的虛擬功能可以保證無論你使用指針(見鏈接Parent* p2
或Child* cp
的例子)在一類具有一些涉及繼承,它總是會調用繼承鏈中最「年輕」的孩子的實現。
示例:如果您具有完全相同的函數定義和全部虛擬的「child - > parent」和「grandchild - > child - > parent」,現在可以假設在所有中調用「grandchild :: f2」情況。如果您在父項中省略了「虛擬」關鍵字,則可能會調用不同的函數,具體取決於您用來訪問實例的指針。
所以。這有什麼用?想象一下,你有一個基於模板的集合,並希望將子集放入定義爲父類型集合list<Parent*>
的集合中。如果你現在調用一個你從列表中獲取的元素的函數,你可以期望調用這個孩子的函數(定義)!如果您在f2()
定義中省略「虛擬」關鍵字,則會調用父項功能,這在大多數情況下可能是意外/不期望的。
還好嗎? :-)