Это действительно должен быть комментарий, но я делаю его ответом, чтобы я мог отформатировать его для удобства чтения.
@ jalf и @dvl - Как было сказано выше @dvl, ни один из контейнеров std не имеет виртуальных деструкторов.Почему это имеет значение?
Допустим, вы получили класс "X" из std :: deque.
class X : public std::deque<int>
{
// whatever ...
};
Давайте теперь скажем, что у вас есть объект "X", на который указывает базовый указатель.
std::deque<int> *p = new X;
и вы удалите его
delete p;
Деструктор для производного класса X не будет вызван, что может привести к множеству проблем.
Ваши параметры:
1. Не производные от контейнеров std.Сделайте их членами данных и напишите оболочки для предоставления функциональности.
2. Производные от контейнеров std только в том случае, если у производного класса нет деструктора и нет элементов данных с деструкторами.
3. Если вы производны от контейнера std,обратитесь к нему с помощью базового указателя.
После создания класса иногда трудно понять, как этот класс может использоваться в будущем.По этой причине многие разработчики строго придерживаются варианта «1».Лично я разрешаю извлекать из стандартного контейнера, если он хорошо документирован и используется с осторожностью.