C++編程規範之38:實施安全的覆蓋
摘要:
負責任地進行覆蓋:覆蓋一個虛擬函數時,應該保持可替換性;說得更具體一點,就是要保持基類中函數的前後置條件。不要改變虛擬函數的默認參數。應該顯式地將覆蓋函數重新聲明為virtual.
雖然派生類通常會增加更多狀態,但他們所建模的是其基類的子集而非超集。在正確的繼承關係中,派生類所建模的是更一般的基礎概念的一個特例。
定義一個可能的失敗的派生覆蓋函數,隻是在基類沒有聲明換做總是成功的時候,這個定義才是正確的。在覆蓋的時候,永遠不要修改默認參數。它們不是函數簽名的一部分,客戶代碼將因為不知情而將不同參數傳遞給函數,具體要傳遞給哪一個參數,將取決於它們具有層次結構中那個節點的訪問權限。
對於調用者而言,同一個對象的成員函數會不加提示地根據自己訪問所使用的靜態類型而接受不同參數,這可能是一件非常令人奇怪的事情。在覆蓋函數時,應該添加冗餘的virtual.這能夠更清楚地想閱讀代碼的人表達自己的意圖。謹防不小心在基類中隱藏了重載函數。關於重載、覆蓋、隱藏的概念區分詳見:https://blog.csdn.net/longshengguoji/article/details/17691913
最後更新:2017-04-03 12:54:00
上一篇:
對 GNU Radio 進行 Octave 分析
下一篇:
linux驅動開發--字符設備:簡單的file_operations示例
如何用React-Router進行頁麵權限管理
PostgreSQL 10.0 preview 功能增強 - 國際化功能增強,支持ICU(International Components for Unicode)
為了推廣太極文化,馬雲要演電影了
偷了世界的程序員
在VS2008環境下配置DirectX目錄
nagios客戶端未啟動報錯
怡海軟件:不上ERP等死,上了ERP找死?!
《Apache Zookeeper 官方文檔》管理分布式係統就像管理動物園一樣
Redis4.0新特性(一)-Memory Command
剖析Disruptor:為什麼會這麼快?(一)Ringbuffer的特別之處