У меня есть любимый проект, с которым я экспериментирую с новыми возможностями 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
.Но я ищу способы иметь дело с этим, таким образом, мой вопрос действительно, есть ли надлежащий способ иметь дело с этим? И: я корректен в размышлении, что этот деструктор является поддельным, или является там реальной целью к нему?
Деструктор класса, который предназначен для создания подклассов, всегда должен быть виртуальным, ИМХО.
Виртуальный деструктор в базовом классе необходим только в том случае, если экземпляр производного класса будет удален через указатель на базовый класс.
Наличие любой виртуальной функции в классе, включая деструктор, требует накладных расходов. Boost (и стандартная библиотека TR1 и C ++ 11) не хочет заставлять вас иметь эти накладные расходы только потому, что вам нужно иметь возможность получить shared_ptr
из this
указатель.
Деструктор пуст, зачем он вообще?
Если у вас нет определяемого пользователем конструктора, компилятор предоставляет его вам, так что это не имеет особого значения.
Я не могу представить, чтобы кто-то захотел удалить свой экземпляр по ссылке
enable_shared_from_this
.
Совершенно верно.
Что касается предупреждения компилятора, я бы проигнорировал это предупреждение или подавил его (с комментарием в коде, объясняющим, почему вы это делаете). Иногда, особенно на «педантичных» уровнях предупреждений, предупреждения компилятора бесполезны, и я бы сказал, что это один из таких случаев.
Я согласен с описанием Jame, но хотел бы добавить
Виртуальный деструктор требуется только в том случае, если вы хотите виртуально уничтожить экземпляр этого класса. Это не всегда так, однако, если базовый класс не предназначен для виртуального уничтожения, он должен защищать от него
Поэтому я бы изменил
Деструктор класса, который предназначен для создания подклассов, должен всегда быть виртуальным, ИМХО.
это должно быть:
Деструктор класса, который предназначен для создания подклассов, должен всегда быть виртуальным или защищенным .