Чистый виртуальный деструктор в C ++ - PullRequest
153 голосов
/ 10 марта 2009

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

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

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

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

Ответы [ 2 ]

201 голосов
/ 10 марта 2009

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

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

inline A::~A() { }

должно хватить.

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

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

46 голосов
/ 10 марта 2009

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

12,4 Деструкторы

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

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

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

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

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

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

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