對於常規的基類函式來說:
1 盡量使用非虛擬介面模式
(nvi)
讓介面函式成為非虛擬的.
2 盡量讓虛函式成為私用的.
3 只有當派生類需要呼叫基類對某個虛函式的實現時,才把虛函式宣告為保護的.
4 基類的析構函式應該要麼為共有虛函式
,要麼為保護虛函式.
說明: 1,2
兩條將虛共有介面的兩個職責進行了很好的分解
,遵守了單一職責原理.
第4條說明了
,如果要使用多型
(指標呼叫
),那麼基類的析構函式一定要為虛函式
;如果基類本身的設計不是處於多型考慮的話
,那麼就應該將析構函式設為保護型別
.這樣可以防止出現使用指標的析構
(基類無法被直接析構
), 只有派生類才能析構基類.
1) 非虛介面模式
(nvi)
的說明:基類對介面具有完全控制權,很方便在乙個單一的、可復用的地方實施
(enforce)
介面的前條件跟後條件、插入一些裝置或做一些類似的事情。更好的是實現介面和實現分離;讓基類在變化面前更穩定。條件檢查可以僅在調式期有效,這更易於控制。如果非虛函式僅有唯一一行**呼叫,編譯器會做內聯優化,沒有效率問題。
C 再學習系列 模板函式的自定義點
模板函式 在編寫模板時 可以通過一些顯示的自定義 對模板引數型別做一些必要的限制 選擇1 模板直接依賴於型別具有給定名字的合適的成員函式 則顯式要求引數 t提供該成員函式.選擇2 模板依賴於 型別具有給定名字的合適的非成員函式 則顯式的要求 t具有給定名字 簽名和語義的非成員函式.選擇3 模板依賴於...
C 再學習系列 模板函式的自定義點
在編寫模板時 可以通過一些顯示的自定義 對模板引數型別做一些必要的限制 選擇 1 模板直接依賴於型別具有給定名字的合適的成員函式 則顯式要求引數t提供該成員函式 選擇 2 模板依賴於 型別具有給定名字的合適的非成員函式 則顯式的要求t 具有給定名字 簽名和語義的非成員函式 選擇 3 模板依賴於 型別...
C 再學習系列 函式模板和類模板
函式模板和類模板 c 提供類模板和函式模板。函式模板允許過載 而類模板不允許過載 類無過載概念 類模板可以進行全特化和偏特化,而函式模板僅能夠全特化 因此,寫乙個看似函式模板偏特化的函式模板實際上是在寫乙個單獨的主函式模板!由於函式模板可以過載,因此存在過載決議。但是記住,函式模板特化並不參與過載。...