Итак, я использовал контейнер, полученный из std::vector в течение некоторого времени. Возможно, это плохое дизайнерское решение по нескольким причинам, и вопрос о том, нужно ли вам делать такую вещь, здесь широко обсуждается:
Вы не должны наследовать от std::vector
Подкласс/наследование стандартных контейнеров?
Есть ли какой-либо реальный риск для получения из контейнеров STL С++?
Можно ли наследовать реализацию из контейнеров STL, а не делегировать?
Я уверен, что я пропустил некоторые из обсуждений... но разумные аргументы для обеих точек обзора найдены в ссылках. Насколько я могу судить, "потому что ~ vector() не является виртуальным" является основой для "правила", которое вы не должны наследовать из stl-контейнеров. Однако, если я посмотрю на реализацию для std::vector в g++ 4.9.2, я обнаружил, что std::vector наследует от _Vector_base и _Vector_base не виртуальный деструктор.
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
{
...
~vector() _GLIBCXX_NOEXCEPT
{ std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
_M_get_Tp_allocator()); }
...
}
где:
template<typename _Tp, typename _Alloc>
struct _Vector_base
{
...
~_Vector_base() _GLIBCXX_NOEXCEPT
{ _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage
- this->_M_impl._M_start); }
...
}
Таким образом, реализация gcc 4.9.2 std::vector наследуется от базовых классов с не виртуальным деструктором. Это заставляет меня думать, что это приемлемая практика. Почему это нормально? Каковы конкретные условия, при которых такая практика не опасна?