Я всегда слышал, что вы не должны наследовать класс без виртуальных деструкторов, и я не обращал много внимания, потому что я просто не использую наследование так часто. Применяется ли это правило, даже если вы не хотите использовать полиморфизм, но вы просто хотите, чтобы все функциональные возможности класса, и вы хотите добавить еще несколько? Чтобы быть конкретным, мог ли следующий класс быть безопасным, с четко определенным поведением, если я не использовал его полиморфно? (не то есть не удаление базовых указателей на производные объекты)Наследование классов без виртуальных деструкторов
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-много» и «диапазоны»), так как доступ вне границ обычно * логическая * ошибка. –
Я думаю, что в вашем конкретном примере наследование не является изрядно изящным решением, поскольку наследование предназначено для повторного использования интерфейса, а не для повторного использования. Вы явно не используете интерфейс повторно, так как ваш 'operator []' выдает исключение, которое 'std :: vector' не будет. Если вы хотите повторно использовать код, просто используйте простые общие функции или (как в этом случае), сделайте 'std :: vector' членом' SomewhatSafeVector'. –
@ KerrekSB: Во-первых, почему бы и нет? Во-вторых, у меня таких проблем нет. Но я думаю, что проверенные контейнеры с ограничениями были бы хорошей идеей для учебных и отладочных целей. –