Чистый виртуальный деструктор в С++

Неправильно ли писать:

class A {
public:
    virtual ~A() = 0;
};

для абстрактного базового класса?

По крайней мере, что компилируется в MSVC... Будет ли он работать во время выполнения?

Ответ 1

Да. Вам также необходимо реализовать деструктор:

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }

должно быть достаточно.

И так как это получило пониженное голосование, я должен уточнить: если вы извлекаете что-либо из A, а затем пытаетесь удалить или уничтожить его, в конечном итоге будет вызван деструктор A. Поскольку он является чистым и не имеет реализации, будет действовать поведение undefined. На одной популярной платформе, которая вызовет обработчик purecall и сбой.

Изменить: исправление объявления более согласованным, скомпилировано с http://www.comeaucomputing.com/tryitout/

Ответ 2

Частные деструкторы: они дадут вам ошибку при создании объекта производного класса, а не иначе. Диагностика может появиться.

12.4 Деструкторы

6 Деструктор может быть объявлен виртуальным (10.3) или чистым виртуальным (10.4); если в программе созданы какие-либо объекты этого класса или любого производного класса, деструктор должен быть определен.

Класс с чистым виртуальным деструктором является абстрактным классом. Хорошо заметьте:

10.4 Абстрактные классы

2 Чистая виртуальная функция должна быть определена только при вызове с или, как если бы с (12.4), синтаксисом квалифицированного идентификатора (5.1).

[Примечание: объявление функции не может предоставить как чисто-спецификатор, так и определение -end примечание]

Взято прямо из черновика:

struct C {
   virtual void f() = 0 { }; // ill-formed
};