Zawsze słyszałem, że nie powinieneś dziedziczyć z klasy bez wirtualnych destruktorów, a ja nie zwracałem na to uwagi, ponieważ po prostu nie używam dziedziczenia tak często. Czy ta reguła ma zastosowanie, nawet jeśli nie chcesz używać polimorfizmu, ale chcesz tylko całej klasy i chcesz dodać więcej? Żeby być konkretnym, czy następująca klasa byłaby bezpieczna, o dobrze określonym zachowaniu, o ile nie używałbym jej polimorficznie? (to znaczy nie ma Usuwanie bazowe wskaźniki do obiektów pochodzących)Dziedziczenie z klas bez destruktorów wirtualnych
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);
}
};
Nieważne, czy jest OK, czy nie, ale nadal nie powinieneś czerpać ze standardowych kontenerów bibliotecznych. Co więcej, jeśli masz kłopoty z dostępem do dynamicznych kontenerów w ich granicach, możesz raczej spojrzeć na swoje myślenie algorytmiczne z dużym obrazem (pomyśl "0-1-wiele" i "zakresy"), ponieważ niezwiązany dostęp jest zwykle błąd * logiki *. –
Myślę, że w twoim konkretnym przykładzie, dziedziczenie nie jest strasznie eleganckim rozwiązaniem, ponieważ dziedziczenie jest przeznaczone do ponownego użycia interfejsu, a nie ponownego użycia. Oczywiście nie korzystasz ponownie z interfejsu, ponieważ 'operator []' zgłasza wyjątek, którego 'std :: vector' nie będzie. Jeśli chcesz ponownie użyć kodu, użyj prostych funkcji współdzielonych lub (jak w tym przypadku), przekształć 'std :: vector' w element' SomewhatSafeVector'. –
@KerrekSB: Po pierwsze, dlaczego nie? Po drugie, nie mam takich kłopotów. Sądzę jednak, że sprawdzone kontenery są dobrym pomysłem do celów instruktażowych i debugowania. –