Я всегда слышал, что вы не должны наследовать от класса без виртуальных деструкторов
Это практическое правило, данное новичкам, потому что объяснение всех хитростей занимает слишком много времении просто безопаснее (и не так уж и дорого для программ упражнений) на самом деле дать им всего несколько базовых строк, которые работают постоянно (хотя может быть излишним).
Вы можете прекрасно использовать наследование без virtual
деструктор в базовом классе.С другой стороны, если базовый класс вообще не имеет метода virtual
, то наследование, вероятно, является неподходящим инструментом для работы. Например: в вашем случае, если я использую SafeVector<T> sv; sv[3];
, тогда это безопасно, однако, если я использую std::vector<T>& v = sv; v[3];
, это не так ... это потому, что вы просто скрываете метод базового класса, не переопределяя его (поднимите ваш уровень предупреждения, они сообщат вам).
Надлежащим способом здесь будет использование композиции, а затем создание методов пересылки для члена реализации для этих методов.Вы действительно используете.На практике это утомляет, потому что C ++ не поддерживает делегирование (using attribute.insert;
), поэтому многие прибегают к наследованию ...
Другой альтернативой является предоставление более безопасных методов в качестве бесплатных методов, поскольку вы всегда можете добавить бесплатные методыбез ограничений.Это может показаться менее идиоматичным людям с мышлением «ОО», и некоторые операторы не могут быть добавлены таким образом.