簡體   English   中英

課程默認是最終的嗎?

[英]Should classes be final by default?

引用Effective C ++(Scott Meyers),第三版,第7項:

在多態基類中聲明析構函數是虛擬的。

這意味着要繼承的類至少應該具有析構函數virtual。

在編寫一些應用程序/庫時,有些類(我會說並不少)不是為了繼承而設計的。 我們通常依賴於一些約定,其中一個不應該繼承不屬於他自己的類或者不檢查它是否安全。

現在,編碼標准可能需要編寫和設計類,以便繼承始終是安全的。 我覺得這可能太多了。 C ++ 11添加了final關鍵字,確保不繼承類。 您是否建議將默認情況下未設計為繼承的所有類標記為final

這將使編譯器強制執行我們多年來一直遵循的慣例。 但是,可以認為該約定已經被充分理解並且易於遵循(特別是因為通常避免繼承,並且優選組合),因此在編寫代碼時可能只是另一件事。

僅僅因為一個類沒有任何虛函數並不意味着從它繼承就沒有意義了。 它只是意味着它可能沒有意圖,你必須小心不要通過指向基類的指針刪除任何派生對象的實例。 private繼承通常會在這種情況下使用,作為組合的替代,表示繼承自base的純粹是一個實現細節,並且派生類不被視為與base具有“is-a”關系。

標記一個類final是一種很好的方式來表達一個類本來不是要通過使它成為不可能而衍生出來的。 因此,如果這是你想要的,一個巴掌final的類。

在某些情況下,標記(派生)類final以防止任何進一步的派生也可以具有使編譯器更容易使函數調用虛擬化的額外好處,從而在某些情況下導致更好的性能。

看來, final應該(通常)是默認值,然后如果你發現你需要/想要從類中派生出來,你可以稍后刪除它。 但這只是意見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM