Подтвердить что ты не робот

Может ли деструктор быть окончательным?

Позволяет ли стандарт С++ объявить деструктор как final? Вот так:

 class Derived: public Base
 {
      ...
      virtual ~Derived() final;
 }

И если да, то это предотвращает объявление производного класса:

 class FurtherDerived: public Derived {// allowed?
 }

Если это разрешено, компилятор может выдать предупреждение? Объявляет ли деструктор final работоспособной идиомой для указания того, что класс не предназначен для использования в качестве базового класса?

(нет смысла делать это в конечном базовом классе, только производный класс.)

4b9b3361

Ответ 1

Может ли деструктор С++ быть объявлен как final?

Да.

И если да, то это предотвращает объявление производного класса:

Да, потому что производный класс должен был бы объявить деструктор (явно или неявно компилятором), и этот деструктор будет переопределять функцию, объявленную final, которая плохо сформирована.

Правило [class.virtual]/4:

Если виртуальная функция f в некотором классе B помечена спецификатором virt final, а в классе D, полученном из B, функция D​::​f переопределяет B​::​f, программа плохо сформирована.

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

Объявляет ли деструктор окончательной работоспособной идиомой для указания того, что класс не предназначен для использования в качестве базового класса?

Эффективно, но вы должны просто пометить класс final. Это довольно понятно.