天天看點

[C++再學習系列] 虛函數的4條規則

對于正常的基類函數來說:

1 盡量使用非虛拟接口模式(NVI)讓接口函數成為非虛拟的。

2 盡量讓虛函數成為私用的。

3 隻有當派生類需要調用基類對某個虛函數的實作時,才把虛函數聲明為保護的。

4 基類的析構函數應該要麼為共有虛函數,要麼為保護虛函數。

說明;1,2兩條将虛公有接口的兩個職責進行了很好的分解,遵守了單一職責原理。

  第4條說明了:如果要使用多态(指針調用),那麼基類的析構函數一定要為虛函數;如果基類本身的設計不是處于多态考慮的話,那麼就應該将析構函數設為保護類型。這樣可防止出現使用指針的析構(基類無法被直接析構),隻有派生類才能析構基類。

  1) 非虛接口模式(NVI)的說明:基類對接口具有完全控制權,很友善在一個單一的、可複用的地方實施(enforce)接口的前條件。後條件、插入一些裝置或做一些類似的事情。更好的是實作接口和實作分離;讓基類在變化面前更穩定。條件檢查可以僅在調式期有效,這更易于控制。如果非虛函數僅有唯一一行轉發調用,編譯器會做内聯優化,沒有效率問題。

本文轉自 zhenjing 部落格園部落格,原文連結:http://www.cnblogs.com/zhenjing/archive/2010/11/30/virtual_function.html   ,如需轉載請自行聯系原作者

繼續閱讀