Когда у меня есть класс, требующий виртуального деструктора, достаточно ли его объявить виртуальным (и пусть компилятор сгенерирует определение), или я должен определить его явно?Достаточно ли объявить деструктор виртуальным?
ответ
Вы должны явно указать virtual ~destructorName()
. Просто потому, что у вас есть производный класс, по умолчанию не создается деструктор класса bass.
Вы меня не поняли - я спросил, достаточно ли этого, чтобы объявить его (явно) виртуальным или я должен был его определить. – NPS
Если компилятор генерирует деструктор для вас:
§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), что может означать их удаление. Специальная функция-член предоставляется пользователем, если он объявлен пользователем и явно не указан по умолчанию или удален по его первой декларации. Предоставленная пользователем функция с явно дефолтным значением (то есть явно дефолт по умолчанию после ее первого объявления ) определена в том месте, где оно явно по умолчанию; если такая функция неявно определена как удаленная, программа плохо сформирована.
- 1. Можно ли объявить деструктор приватным?
- 2. Как сделать этот деструктор виртуальным
- 3. Когда ваш деструктор будет виртуальным?
- 4. Безопасно объявить невиртуальный деструктор в производном классе
- 5. Должен ли абстрактный деструктор класса быть чистым виртуальным?
- 6. Почему можно сделать деструктор чистым виртуальным
- 7. Мог ли неявный деструктор полиморфного класса быть виртуальным?
- 8. Как объявить деструктор в SystemC?
- 9. Как объявить деструктор шаблонного класса
- 10. C++: Можно ли объявить метод виртуальным в производном классе, если он не был виртуальным в базе?
- 11. Нужно ли переопределять функции виртуальным?
- 12. Как вызвать деструктор из базового класса, который не является виртуальным?
- 13. подталкивания «деструктор не является виртуальным» ошибка в MSVC 11
- 14. Достаточно ли достаточно атомной операции
- 15. Может ли виртуальный деструктор быть плохим?
- 16. Должен ли деструктор быть виртуальным, когда класс является частью более крупной структуры?
- 17. Является ли определение деструктора производного класса необходимым, если деструктор базового класса является виртуальным?
- 18. Если деструктор базового класса, который вы не будете использовать для удаления объекта, должен быть виртуальным?
- 19. Достаточно ли удалить оператор = (Тип типа)?
- 20. Будет ли вызван деструктор?
- 21. Вызывается ли деструктор автоматически?
- 22. Достаточно ли достаточно билетов на проверку подлинности?
- 23. Достаточно ли достаточно авторизации URL в ASP.NET?
- 24. виртуальный деструктор?
- 25. Должен ли быть инициализирован класс с переопределенным чистым виртуальным деструктором?
- 26. Узнайте, объявлено ли свойство виртуальным
- 27. Объявить и реализовать чистый виртуальный деструктор в одной строке?
- 28. Как объявить виртуальный деструктор, не нарушая перемещения и копирование конструкторов
- 29. Почему элемент calss n из B имеет разное значение, когда деструктор класса A является виртуальным или не виртуальным?
- 30. Должен ли каждый класс иметь виртуальный деструктор?
Сгенерированное компилятором определение никогда не будет виртуальным. Если вы объявите деструктор, компилятор просто не определит его. – chris
Тогда я думаю, вы должны ответить на этот вопрос? – NPS
['virtual ~ Foo() = default;'] (http://coliru.stacked-crooked.com/a/ca639bb3d749f4a2)? – Borgleader