從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
因此,雖然從STL 容器派生提供了某些優勢,例如啟用函數重載和模板專門化,但至關重要謹慎行事並確保您不會使用非虛擬析構函數覆蓋基類析構函數。如果您需要多態行為,請考慮使用組合而不是繼承。
以上是您應該從 C STL 容器派生嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!