虛函式(動態繫結)對於 OO C 的重要性

2021-09-23 01:36:21 字數 630 閱讀 1053

虛函式(動態繫結)對於 oo/c++來說是主要的嗎?

是的!沒有虛函式,c++ 就不是物件導向的了。算符過載和非虛成員函式很好,但畢竟,它們只是更典型的c概念中傳遞乙個struct的指標給函式的句法裝飾而已。雖然標準庫包含了許多模板以實現同樣非常好的「泛型程式設計(譯註:也稱通用程式設計,"generic programming")」技術,但虛函式仍然是用c++進行物件導向程式設計的核心。

從商業角度看,如果沒有虛函式,那麼也就沒有什麼理由要從傳統的 c 轉移到c++了。(在本faq中我們將忽略泛型程式設計和標準庫)。技術人員通常認為在c和非物件導向的c++之間有很大的區別,但如果沒有物件導向,這個區別通常不足以證明培訓開發者,新工具等的成本是值得的。換句話說,如果我被某個經理徵詢意見,是否從c轉向非物件導向的c++(也就是說,轉換語言而不轉換典範),那麼我可能會勸阻他這樣做,除非有逼不得已的面向工具的原因。從商業角度看,物件導向能使系統具有可擴充套件性和可適應性,但只有c++類的語法而沒有物件導向的話,就不會減少維護成本,而實際上會增加培訓成本。

底線:沒有虛函式的c++不是物件導向。用類程式設計而沒有動態繫結則稱為「基於物件」,而不是「物件導向」。踢出虛函式和踢出oo(譯註:即物件導向)是一回事。所剩下的就是基於物件程式設計了,和最初的ada語言類似(順便說一下,新的ada語言支援oo而不是基於物件程式設計了)。

虛函式與動態繫結

在定義基類時,我們希望基類中的有些函式可以在派生類中重新定義。比如,我們定義了基類記錄的書,可以求出買了多少書花了多少錢 而在派生類中,我們定義的是打折的書,還是要計算買了多少書花了多少錢。這時,就需要重新定義計算錢數的函式了。注意,這裡的重新定義,與之前講過的函式過載或者操作符過載不同 後面兩類,...

虛函式 多重繼承 動態繫結

class a class b public a class c public b 假設我們定義乙個類b的物件。由於bobject是類b的乙個物件,故bobject包含乙個虛表指標,指向類b的虛表。int main int main int main 程式在執行p vfunc1 時,會發現p是個指標...

c 規避虛函式的動態繫結

如果我們希望明確指定呼叫 基類 還是 子類的虛函式版本。那麼可以通過作用域運算子 注 這一特性是設計模式中 責任鏈模式 的核心實現手段。class a class b public a int tmain int argc,tchar ar 這個特性非常有用,當很多派生類 都用相同動作時,我們可以把...