Неправильно ли писать:
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
. Поскольку он является чистым и не имеет реализации, будет действовать поведение undefined. На одной популярной платформе, которая вызовет обработчик purecall и сбой.
Изменить: исправление объявления более согласованным, скомпилировано с http://www.comeaucomputing.com/tryitout/
Частные деструкторы: они дадут вам ошибку при создании объекта производного класса, а не иначе. Диагностика может появиться.
12.4 Деструкторы
6 Деструктор может быть объявлен виртуальным (10.3) или чистым виртуальным (10.4); если в программе созданы какие-либо объекты этого класса или любого производного класса, деструктор должен быть определен.
Класс с чистым виртуальным деструктором является абстрактным классом. Хорошо заметьте:
10.4 Абстрактные классы
2 Чистая виртуальная функция должна быть определена только при вызове с или, как если бы с (12.4), синтаксисом квалифицированного идентификатора (5.1).
[Примечание: объявление функции не может предоставить как чисто-спецификатор, так и определение -end примечание]
Взято прямо из черновика:
struct C {
virtual void f() = 0 { }; // ill-formed
};