從 std::string 類別派生是一種誤導性的做法嗎?
在《Effective C》中,建議不要從 std::string 派生string 類別主要是因為它缺少虛擬析構函數。這種配置引起了一些關於適合作為基類的類的具體要求的混亂。
與類別必須有資格繼承才能充當非多態性基底類別的假設相反,C提供程式碼重用的替代機制。例如,私有繼承可以促進混合或面向方面的編程,而公共繼承專門用於多態場景。
不鼓勵從 std::string 派生的普遍原因在於值類型和引用之間的區別C 中的類型。與 Java 和 C# 不同,C 類別是值類型,這表示在繼承操作期間執行逐值複製。因此,當衍生類別與基底類別具有不同的記憶體佔用時,就會出現切片問題,從而導致意外行為和潛在的不一致。
為了緩解此問題,應優先考慮非成員和非友元函數用於擴充功能。如果認為繼承是必要的,則應採用組合或模板元編程來避免與切片相關的陷阱。
總而言之,不建議從 std::string 派生,因為它缺少虛擬析構函數並且與 C 中的值類型繼承相關的固有複雜性。
防止非多態用法
如果基類僅用於代碼重用而不是用於多態性目的,則沒有簡單的機制來阻止客戶端直接通過指標或引用實例化派生類別。然而,利用 static_assert 或類型特徵技術可以提供運行時檢查來檢測不合格的使用情況。
以上是你應該從 `std::string` 派生嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!