Подтвердить что ты не робот

Контейнеры STL предназначены для разрешения наследования?

Возможный дубликат:
Можно ли наследовать реализацию из контейнеров STL, а не делегировать?

Мой вопрос связан с Почему контейнеры STL не имеют виртуальных деструкторов? Некоторые люди (включая автора первого вопроса) убеждены, что не имея виртуального dtor, этот класс не наследуется. Я скептически отношусь к такому сильному заявлению, поэтому я попросил источник или некоторые аргументы, но большинство респондентов молчат. Также никто не ответил на мой ответ

Поэтому я думаю, что это хорошая идея поставить под сомнение предположения, сделанные в первом вопросе, и прояснить этот важный вопрос. Контейнеры STL предназначены для разрешения наследования или нет? И в целом: виртуальный деструктор, необходимый для наследования?

4b9b3361

Ответ 1

Контейнеры STL предназначены для разрешения наследования или нет?

Стандартные библиотечные контейнеры позволяют наследовать. Ничто не мешает вам наследовать из стандартного класса контейнера библиотеки. Если вы это сделаете, вы не получите ошибок компиляции.
Но то, для чего они не предназначены, это разрешить уничтожение объекта производного класса с помощью указателя базового класса. Поэтому, если вы хотите использовать наследование для такого сценария (вкратце для динамического полиморфизма), то стандартные библиотеки контейнеров явно не предназначены для этого.

Виртуальный деструктор, необходимый для наследования?

Деструктор базового класса должен только быть виртуальным, если вы намереваетесь вызывать delete в указателе базового класса, указывающем на объект производного класса. Это приведет к поведению Undefined, если деструктор базового класса не является виртуальным.

Итак, чтобы подвести итог, это правило:

Если вам требуется наследование для динамического полиморфизма, стандартные классы контейнеров библиотеки не предназначены для него, но если вам не нужно, что вы можете надежно их унаследовать.

Примечание. Ваш анализ в приведенной вами ссылке ответа является правильным. Он просто не получал ответов, вероятно, потому, что ответ был опубликован долго (через несколько лет) после того, как был опубликован оригинальный Q. Теперь у вас есть +1.