有誰知道爲什麼STL容器沒有虛擬析構函數?爲什麼STL容器沒有虛擬析構函數?
據我所知,唯一的好處是:
- 它由一個指針(到虛擬方法表)和
- 減少一個實例的大小它使破壞和結構的小位更快。
缺點是以通常的方式子集化容器是不安全的。
編輯: 也許我的問題可以改寫爲什麼不是STL容器設計允許繼承?
因爲它們不支持繼承,所以當想要有一個需要STL功能的新容器加上少量附加功能時(例如,使用默認值的專門構造函數或新訪問器對地圖,或其他):
- 組成和接口複製:使擁有該STL容器作爲私有成員,每種方法STL的一個交叉聯方法一個新的模板或類。這與繼承一樣有效,避免了虛擬方法表(在重要的情況下)的成本。不幸的是,STL容器有相當寬泛的接口,所以這需要許多代碼來完成一些看起來應該很容易的事情。
- 只是使功能:使用裸(可能模板化)文件範圍的功能,而不是嘗試添加成員函數。在某些方面,這可能是一個很好的方法,但封裝的好處將會丟失。
- 具有公共STL訪問的組合:讓STL容器的所有者允許用戶訪問STL容器本身(可能通過訪問者保護)。這需要庫編程人員的最少編碼,但對用戶來說不太方便。組合的最大賣點之一是可以減少代碼中的耦合,但是該解決方案將STL容器與所有者容器完全耦合(因爲所有者返回了真正的STL容器)。
- 編譯時多態性:寫操作可能有點棘手,需要一些代碼體操,並且不適合所有情況。
作爲一個方面的問題:是否有與非虛析構函數(我們假設我不希望覆蓋任何方法,只是我要添加新的)繼承的標準安全方式?我的印象是,如果沒有能力改變定義非虛擬類的代碼,那麼沒有通用的和安全的方法來做到這一點。
編輯2:
作爲@doc points out,C++ 11的發燒友using
聲明低的組合物的成本有所。
你錯過的 「它不鼓勵使用繼承不當程序員」 的好處。從STL容器繼承可能有一個合理的理由,但我從來沒有找到過。 – Tom 2009-10-30 03:14:25
並回答你的問題:'喜歡組成繼承'。 – 2009-10-30 07:22:39
你爲什麼想要繼承它? – jalf 2009-10-30 12:03:06