По крайней мере, что компилируется в MSVC... Будет ли он работать во время выполнения?
Ответ 1
Да. Вам также необходимо реализовать деструктор:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
должно быть достаточно.
И так как это получило пониженное голосование, я должен уточнить: если вы извлекаете что-либо из A, а затем пытаетесь удалить или уничтожить его, в конечном итоге будет вызван деструктор A. Поскольку он является чистым и не имеет реализации, будет действовать поведение undefined. На одной популярной платформе, которая вызовет обработчик purecall и сбой.
Частные деструкторы: они дадут вам ошибку при создании объекта производного класса, а не иначе. Диагностика может появиться.
12.4 Деструкторы
6 Деструктор может быть объявлен виртуальным (10.3) или чистым виртуальным (10.4); если в программе созданы какие-либо объекты этого класса или любого производного класса, деструктор должен быть определен.
Класс с чистым виртуальным деструктором является абстрактным классом.
Хорошо заметьте:
10.4 Абстрактные классы
2 Чистая виртуальная функция должна быть определена только при вызове с или, как если бы с (12.4), синтаксисом квалифицированного идентификатора (5.1).
[Примечание: объявление функции не может предоставить как чисто-спецификатор, так и определение -end примечание]