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

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

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

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

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

2 ответа

Решение

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

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
};
Другие вопросы по тегам