我一直聽說你不應該從沒有虛擬析構函數的類繼承,而且我也沒有多加註意,因爲我不經常使用繼承。即使你不想使用多態性,這個規則是否適用,但你只是想要所有類的功能,並且你想添加更多?具體而言,只要我沒有多態使用它,下面的類是否安全,具有明確定義的行爲? (即不刪除基地指針派生的對象)從沒有虛擬析構函數的類繼承
template<typename T>
class SomewhatSafeVector : public std::vector<T>
{
public:
typedef std::vector<T> base;
T& operator[](unsigned n) {
if (n >= base::size())
{
throw IndexOutOfBounds();
}
return base::operator[](n);
}
};
不要介意它是否正常,但你仍然不應該從標準庫容器派生。此外,如果您在訪問動態容器時遇到困難,您可能更願意考慮您的全局算法思維(想一想「0-1-many」和「ranges」),因爲out-bound-bound訪問是通常是一個*邏輯*錯誤。 – 2012-03-28 14:31:13
我認爲在你的具體例子中,繼承並不是一個非常優雅的解決方案,因爲繼承意味着接口重用,而不是實現重用。你顯然不會重用接口,因爲你的'operator []'拋出了一個'std :: vector'不會的異常。如果要重用代碼,只需使用普通共享函數或(如本例中那樣),使'std :: vector'成爲'SomewhatSafeVector'的成員。 – 2012-03-28 14:31:40
@KerrekSB:首先,爲什麼不呢?第二,我沒有這樣的麻煩。但是我認爲邊界檢查容器對於教學和調試目的來說是個好主意。 – 2012-03-28 14:34:22