2014-11-20 2 views
2

Когда у меня есть класс, требующий виртуального деструктора, достаточно ли его объявить виртуальным (и пусть компилятор сгенерирует определение), или я должен определить его явно?Достаточно ли объявить деструктор виртуальным?

+2

Сгенерированное компилятором определение никогда не будет виртуальным. Если вы объявите деструктор, компилятор просто не определит его. – chris

+0

Тогда я думаю, вы должны ответить на этот вопрос? – NPS

+6

['virtual ~ Foo() = default;'] (http://coliru.stacked-crooked.com/a/ca639bb3d749f4a2)? – Borgleader

ответ

0

Вы должны явно указать virtual ~destructorName(). Просто потому, что у вас есть производный класс, по умолчанию не создается деструктор класса bass.

+0

Вы меня не поняли - я спросил, достаточно ли этого, чтобы объявить его (явно) виртуальным или я должен был его определить. – NPS

2

Если компилятор генерирует деструктор для вас:

§12.4/4 Если класс не имеет пользовательского объявленная деструктор, деструктор неявно объявлен дефолт (8.4). Неявно объявленный деструктор является встроенным публичным членом своего класса.

Обратите внимание, что вы можете сделать:

virtual ~Struct() = default; 

6 В противном случае деструктор нетривиально. Деструктор, который равен , по умолчанию и не определен как удаленный, неявно определяется, когда он равен odr-used (3.2) для уничтожения объекта его типа класса (3.7) или когда он явно дефолт после его первого объявления.

Или:

virtual ~Struct() { } 

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

§8.4. 3/4 Явно-дефолтные функции и неявно объявленные функции совместно называются по умолчанию, а реализация должна содержать неявные определения fo r them (12.1 12.4, 12.8), что может означать их удаление. Специальная функция-член предоставляется пользователем, если он объявлен пользователем и явно не указан по умолчанию или удален по его первой декларации. Предоставленная пользователем функция с явно дефолтным значением (то есть явно дефолт по умолчанию после ее первого объявления ) определена в том месте, где оно явно по умолчанию; если такая функция неявно определена как удаленная, программа плохо сформирована.

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