首頁 > 後端開發 > C++ > 您應該繼承 C STL 容器嗎?

您應該繼承 C STL 容器嗎?

Barbara Streisand
發布: 2024-12-01 11:58:11
原創
933 人瀏覽過

Should You Inherit from C   STL Containers?

從C STL 容器派生的潛在陷阱

從C 標準庫(STL) 容器派生的實踐一直是爭論,一些人反對使用它。儘管有明顯的優勢,例如重載函數和實現專業化,但這種方法仍然存在潛在風險。

STL 容器中缺乏虛擬析構函數會帶來重大危險。當從缺少虛擬析構函數的 STL 容器衍生類別時,衍生類別可能無法正確處理多態行為。這可能會導致意外結果,尤其是當派生類別的物件儲存在容器中並透過基類指標存取時。

為了說明這一點,請考慮以下場景:

在此範例中,kill_it 函數對派生類別 Charges 沒有任何了解。因此,它將呼叫基底類別 std::vector 的非虛擬析構函數,這可能會導致在銷毀 Charges 類型的物件時出現未定義的行為。如果將 Charges 實作為類型別名或 typedef(如 Rates 所示),則不會發生此行為。

從 STL 容器衍生的另一個潛在問題來自 Microsoft 對向量類別的實作。在該實作中,向量類別本身是透過繼承來實現的,其中向量公開源自 _Vector_Val。這在使用衍生類別時增加了額外的複雜性和潛在危險。

雖然在某些情況下使用繼承可能有優勢,但好處通常伴隨著複雜性和潛在風險的增加。為了清晰起見並避免與衍生相關的潛在問題,通常首選使用容器作為成員變數而不是基底類別的組合。

以上是您應該繼承 C STL 容器嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板