Чи неправильно писати:
class A {
public:
virtual ~A() = 0;
};
для абстрактного базового класу?
Принаймні, що компілюється в MSVC ... Чи вийде з ладу під час виконання?
Чи неправильно писати:
class A {
public:
virtual ~A() = 0;
};
для абстрактного базового класу?
Принаймні, що компілюється в MSVC ... Чи вийде з ладу під час виконання?
Відповіді:
Так. Вам також потрібно реалізувати деструктор:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
повинно вистачити
І оскільки це отримало відмову від голосування, я повинен уточнити: якщо ви отримаєте що-небудь з A, а потім спробуєте його видалити або знищити, A
зрештою буде викликаний деструктор. Оскільки це чисто і не має реалізації, настане невизначена поведінка. На одній популярній платформі, яка викликатиме обробник purecall та виходить з ладу.
Редагувати: виправлення декларації на більш відповідність, складена з http://www.comeaucomputing.com/tryitout/
Приватні деструктори: вони дадуть вам помилку під час створення об’єкта похідного класу - не інакше. Хоча може з’явитися діагностика.
12.4 Руйнівники
6 Деструктор може бути оголошений віртуальним (10.3) або чистим віртуальним (10.4); якщо в програмі створені якісь об'єкти цього класу або будь-якого похідного класу, деструктор повинен бути визначений.
Клас із чистим віртуальним деструктором - це абстрактний клас. Зверніть увагу:
10.4 Анотаційні заняття
2 Чисту віртуальну функцію потрібно визначати лише у випадку, якщо її викликають із (12.4) синтаксисом кваліфікованого ідентифікатора (5.1).
[ Примітка : декларація функції не може надати як чистого специфікатора, так і визначення —закінчити примітку]
Взяте прямо з проекту:
struct C {
virtual void f() = 0 { }; // ill-formed
};