[原創(chuàng)文章歡迎轉(zhuǎn)載,但請保留作者信息]
Justin
于 2010-01-26
條例36很簡短,切勿重寫繼承來的非虛函數(shù)。看了看也就一句話能說明白的事:對于父類的非虛函數(shù),子類老老實實繼承即可,不要重寫覆蓋。道理確是很簡單,如果是可以重新定義的函數(shù),人家自然會用虛函數(shù);如果用的是非虛函數(shù),明擺著就是不讓你亂動嘛@#¥%
接下來的37也不難理解:不要試圖修改繼承來的虛函數(shù)的默認(rèn)參數(shù)。原因嘛,要記錄一下,大師說了:
- 虛函數(shù)是動態(tài)綁定的,或者說是執(zhí)行期確定的。
函數(shù)(包括虛函數(shù))的默認(rèn)參數(shù)是靜態(tài)綁定的,或者說是編譯期確定的。 - 所以我們可以寫出和父類不一樣的虛函數(shù)實現(xiàn),
但是不能指定另外一個和父類函數(shù)默認(rèn)參數(shù)不一樣的默認(rèn)參數(shù)。
有點拗口,沒時間編例子了,就還是看代碼吧:





































在上面的代碼中,由于函數(shù)默認(rèn)參數(shù)的靜態(tài)綁定特性,pA->func()執(zhí)行時param事實上被賦予了123,而非子類中期望的456,雖然接下來執(zhí)行的是子類的函數(shù)實現(xiàn)……
為什么函數(shù)默認(rèn)參數(shù)不能是動態(tài)綁定的呢?因為C++考慮到執(zhí)行效率和復(fù)雜性方面的代價,規(guī)定了只能是靜態(tài)綁定的。(不是我胡謅,還是大師說的)
原因說了,該記解決方式了:
結(jié)合35課上學(xué)到的知識,我們可以用非虛函數(shù)接口(NVI)來解決這個問題,看代碼




























