Будет ли деструктор виртуальным при объявлении default? C++

Прочитав о полезности виртуальных деструкторов пришел к выводу, что лучше всегда деструктор объявлять виртуальным и взять это за правило. Однако столкнулся с интересным вопросом. А что будет, если в классе определен деструктор, так:

virtual ~MyDestructor() noexcept = default;

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


Ответы (1 шт):

Автор решения: Harry

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

Хотите — проверьте сами, код ведь тривиальный:

struct Base
{
    virtual ~Base() = default;
};

struct Der: public Base
{
    ~Der() { cout << "Yes!!"; }
};

int main()
{
    Base * b = new Der;
    delete b;
}

Если деструктор не будет генерироваться — будет ошибка линковки, если не виртуальный — Yes!! вы не увидите :)

→ Ссылка