2015-11-20 1 views
2

Предположим, мы имеем следующий код:Должен ли я явно объявлять деструктор как переопределение в производном классе?

class ISampleInterface 
{ 
public: 
    virtual ~ISampleInterface() {} ; 
    virtual void Method1() = 0; 
    virtual void Method2() = 0; 
}; 

class SampleClass : public ISampleInterface 
{ 
public: 
    SampleClass() { }; 
    ~SampleClass() override { }; 
    void Method1() { }; 
    void Method2() { }; 
}; 

int main() 
{ 
    ISampleInterface *pObject = (ISampleInterface*)new SampleClass(); 
    delete pObject; 
    return 0; 
} 

это лучше явно объявить ~ SampleClass(), как переопределение или не все равно?

P.S. Пожалуйста, сосредоточьтесь на переопределении и не заботитесь о реализации самого деструктора. Это можно определить, я просто приведу здесь пример, чтобы сделать мой вопрос ясным.

ответ

1

Я бы этого не сделал. Я также не вижу смысла декларировать явно тривиальный деструктор. Пусть компилятор выполнит свою работу. Возможно, вам понадобится ввести деструктор virtual в ваш класс, чтобы (i) сделать класс полиморфным - хотя для этого будет выполняться любая функция - и (ii), чтобы помочь в управлении памятью, но здесь это не имеет особого значения.

Или, если вы должны сделать такую ​​вещь, рассмотрите использование = default, вместо того, чтобы явно указывать пустое тело.

+0

Спасибо за ваше мнение, но на самом деле это не ответ. – metal4people

0

ИМХО мнение, что любой ответ был бы предвзятым (т. Е. Основанным на мнениях). Как правило, с помощью override спецификатор среди многих преимуществ имеет преимущество исключения:

  • непреднамеренное наиважнейшая: Нечаянно переопределить виртуальную функцию, объявляя функцию-член, который случайно имеет такое же имя и подпись в качестве базового класса Виртуальных член функция.

  • Несоответствие подписи: Определить функцию в производном классе, которая предназначена для переопределения виртуальной функции в базовом классе, но две функции имеют разные подписи.

There are even people that back up the opinion that the use of override specifier should be mandatory in future version of C++.

Теперь, в частном случае деструктора, прикрепление override спецификатора мне кажется немного многословным.

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

Таким образом, я бы не указал деструктор override.

0

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

Смежные вопросы