Могу ли я получить класс из `std :: array`? - PullRequest
0 голосов
/ 15 ноября 2018

В общем случае стандартные контейнерные классы не предназначены для получения, например, они имеют не виртуальные деструкторы.

Однако я заметил, что std::array вообще не определяет деструктор (по крайней мере, вБиблиотека GNU).

Означает ли это, что std::array безопасно получить из?

Я не собираюсь перегружать ни одну из его функций-членов, просто добавлю еще несколько (в основном, для использования в качестве очереди фиксированного размера).

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Безопасно наследовать от класса с не виртуальным деструктором не публично .Это только публичное наследование, которое потенциально небезопасно.

std::array имеет деструктор независимо от того, был ли он объявлен.У всех классов есть деструкторы. всегда UB - удалять объект через указатель базового класса, если деструктор базового класса не является виртуальным.std::array не отличается в этом отношении.

0 голосов
/ 15 ноября 2018

Виртуальный деструктор требуется только в том случае, если вы собираетесь использовать полиморфизм и delete ваш новый класс как std::array. Это, вероятно, не ваш вариант использования. Если это так, вам не повезло.

Не уверен, какая часть существующей функциональности std::array вам требуется, так что это может быть не лучшим вариантом для вас, но общая цель рекомендации - отдавать предпочтение композиции перед наследованием. Используйте std::array в качестве члена класса, который добавляет новые функции, которые вы хотите, и предоставляет существующую функциональность std::array, которая вам требуется.

...