首頁 >後端開發 >C++ >從C STL容器繼承有風險嗎?

從C STL容器繼承有風險嗎?

Barbara Streisand
Barbara Streisand原創
2024-11-29 03:45:09808瀏覽

Is Inheriting from C   STL Containers Risky?

從 C STL 容器繼承的風險

提出的問題是從標準 C 容器繼承是否有任何真正的風險。作者認為使用 typedef,例如 typedef std::vector費率;,是一種更安全的方法。但是,他們提出了一個特定的用例來探索任何潛在的危險。

用例

考慮以下程式碼片段:

#include <vector>
#include <iostream>

void kill_it(std::vector<double>& victim) {
    delete &victim;
}

typedef std::vector<double> Rates;
class Charges: public std::vector<double> { };

int main() {
  std::vector<double>* p1, *p2;
  p1 = new Rates;
  p2 = new Charges;
  kill_it(p2);
  kill_it(p1);
  return 0;
}

作者建議,任意不幸的使用者可能會在 ??? 中引入錯誤。部分會導致 Charges(衍生類別)出現問題,但不會導致 Rates(typedef)出現問題。

虛擬析構函數

這裡的關鍵問題是標準C 容器沒有虛擬析構函數。因此,您無法以多型方式處理它們。如果您和程式碼的所有使用者都遵守這項原則,那麼從標準容器繼承並不是本質上錯誤的。不過,為了清晰起見,作者建議組合。

組合優於繼承

使用組合比從容器繼承更乾淨、更安全。這涉及創建一個新類,其中包含容器的實例作為成員變數。這允許對類別的功能具有更大的靈活性和控制力。

在此用例中,例如,定義一個包含 std::vector 實例的新 Rates 類別。將允許您添加附加功能,同時仍利用底層容器。這種方法還可以確保正確處理新類別的析構函數,無論基本容器實作為何。

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn