首頁 > 後端開發 > C++ > 您應該從 C STL 容器派生嗎?

您應該從 C STL 容器派生嗎?

Barbara Streisand
發布: 2024-12-01 13:46:13
原創
537 人瀏覽過

Should You Derive from C   STL Containers?

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

在C 程式設計領域,經常會出現關於派生的優點的爭論來自標準庫的優點容器(C 標準庫附帶的容器,例如向量、列表等)或簡單地使用typedef來表示它們(為現有類型建立新名稱而不定義新類型)。雖然這兩種方法各有優勢,但了解從 STL 容器衍生相關的潛在風險至關重要。

使用衍生時,必須記住標準容器(例如向量)不將它們的析構函數宣告為虛擬的。這意味著,如果您從這些容器之一派生並在衍生類別中定義非虛擬析構函數,則在嘗試使用指向基底類別的指標銷毀該衍生類別的物件時會遇到問題。

為了說明這個問題,請考慮以下範例:

class Rates : public std::vector<double> { /* ... */ };

int main() {
    std::vector<double>* p = new Rates;
    delete p;  // This will invoke the non-virtual ~std::vector<double>(), potentially leading to problems
}
登入後複製

在這種情況下,當對指標p 呼叫刪除運算子時,它將呼叫基底類別的析構函數, std::vector,而不是衍生類別Rates 的析構函式。如果衍生類別包含需要在銷毀期間清理的額外資源,這可能會導致問題。

因此,雖然從STL 容器派生提供了某些優勢,例如啟用函數重載和模板專門化,但至關重要謹慎行事並確保您不會使用非虛擬析構函數覆蓋基類析構函數。如果您需要多態行為,請考慮使用組合而不是繼承。

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

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