Когда использовать виртуальные деструкторы?

Я нахожу свой файл css и добавляю к нему маршрут:

app.get('/css/MyCSS.css', function(req, res){
  res.sendFile(__dirname + '/public/css/MyCSS.css');
});

Тогда он работает.

1371
задан Zhenxiao Hao 8 March 2019 в 13:06
поделиться

4 ответа

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

class Base 
{
    // some virtual methods
};

class Derived : public Base
{
    ~Derived()
    {
        // Do some important cleanup
    }
};

Здесь, Вы заметите, что я не объявил, что деструктор Основы был virtual. Теперь, давайте взглянем на следующий отрывок:

Base *b = new Derived();
// use b
delete b; // Here's the problem!

, Так как деструктор Основы не virtual, и b Base* указывающий Derived, объект, delete b имеет неопределенное поведение :

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

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

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

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

можно узнать больше о виртуальности и виртуальном деструкторе базового класса в [1 112] эта статья от Herb Sutter .

1463
ответ дан einpoklum 8 March 2019 в 13:06
поделиться

Сделайте деструктор виртуальным каждый раз, когда Ваш класс является полиморфным.

38
ответ дан Dana 8 March 2019 в 13:06
поделиться
  • 1
    @SigTerm: можно реализовать что-то подобный к bool, но не bool. В частности, преобразования от и до Вашего типа (говорят int) будут пользовательские преобразования а не интегральные продвижения , и может быть самое большее одно неявное определяемое пользователем преобразование в любой допустимой последовательности преобразования. Вы не можете заменить всем использованием bool с Bool, поскольку некоторые из них не скомпилируют. – David Rodríguez - dribeas 24 September 2013 в 16:04

Объявите деструкторы, виртуальные в полиморфных базовых классах. Это - Объект 7 в Scott Meyers Эффективный C++ . Meyers продолжает суммировать это, если класс имеет какой-либо виртуальная функция, он должен иметь виртуальный деструктор и это, классы, не разработанные, чтобы быть базовыми классами или не разработанные, чтобы использоваться полиморфно, должны не , объявляют виртуальные деструкторы.

184
ответ дан Bill the Lizard 8 March 2019 в 13:06
поделиться

Также знайте что, удаляя указатель базового класса, когда нет никакого виртуального деструктора, приведет к неопределенное поведение . Что-то, что я изучил просто недавно:

, Как должен, переопределяя, удаляют в C++, ведут себя?

я использовал C++ в течение многих лет, и мне все еще удается подвесить меня.

43
ответ дан Community 8 March 2019 в 13:06
поделиться
  • 1
    @David я думаю, что Вы не можете реализовать optional< bool> в одном байте способом, который работает над всеми теоретическими реализациями, если Вы хотите обеспечить T& operator*();. Патологическая реализация могла принять весь , доступные комбинации двоичных разрядов представляют одну из истины и лжи, и каждый раз, когда Вы пишете x = true;, случайным образом выбирают один из эти true шаблоны. Это не оставляет Вас никаким стабильным шаблоном для представления дополнительного " none" состояние. Так как необходимо обеспечить ссылку на объект с оператором*, Вы должны иметь bool там где-нибудь. Отметьте это vector< bool> работы вокруг этого с теми страшными прокси. – R. Martinho Fernandes 24 September 2013 в 16:12
Другие вопросы по тегам:

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