Почему enable_shared_from_this имеет невиртуальный деструктор?

У меня есть любимый проект, с которым я экспериментирую с новыми возможностями C++ 11. В то время как у меня есть опыт с C, я довольно плохо знаком с C++. Для обучения меня в лучшие практики, (помимо чтения много), я включил некоторые строгие параметры компилятора (использующий GCC 4.4.1):

-std=c++0x -Werror -Wall -Winline -Weffc++ -pedantic-errors

Это хорошо работало для меня. До сих пор я смог разрешить все препятствия. Однако у меня есть потребность в enable_shared_from_this, и это вызывает меня проблемы. Я получаю соблюдающее предупреждение (ошибка в моем случае) при компиляции моего кода (вероятно, инициированный -Weffc++):

base class ‘class std::enable_shared_from_this<Package>’ has a non-virtual destructor

Так в основном я немного прослушиваюсь этой реализацией enable_shared_from_this, потому что:

  • Деструктор класса, который предназначается для разделения на подклассы, должен всегда быть виртуальным, по моему скромному мнению.
  • Деструктор пуст, почему он имеет вообще?
  • Я не могу предположить, что любой хотел бы удалить их экземпляр в отношении enable_shared_from_this.

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

18
задан James McNellis 10 March 2012 в 04:21
поделиться

2 ответа

Деструктор класса, который предназначен для создания подклассов, всегда должен быть виртуальным, ИМХО.

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

Наличие любой виртуальной функции в классе, включая деструктор, требует накладных расходов. Boost (и стандартная библиотека TR1 и C ++ 11) не хочет заставлять вас иметь эти накладные расходы только потому, что вам нужно иметь возможность получить shared_ptr из this указатель.

Деструктор пуст, зачем он вообще?

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

Я не могу представить, чтобы кто-то захотел удалить свой экземпляр по ссылке enable_shared_from_this .

Совершенно верно.

Что касается предупреждения компилятора, я бы проигнорировал это предупреждение или подавил его (с комментарием в коде, объясняющим, почему вы это делаете). Иногда, особенно на «педантичных» уровнях предупреждений, предупреждения компилятора бесполезны, и я бы сказал, что это один из таких случаев.

25
ответ дан 30 November 2019 в 07:17
поделиться

Я согласен с описанием Jame, но хотел бы добавить

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

Поэтому я бы изменил

Деструктор класса, который предназначен для создания подклассов, должен всегда быть виртуальным, ИМХО.

это должно быть:

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

9
ответ дан 30 November 2019 в 07:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: