it-swarm.com.ru

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

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

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

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

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

153
Ivan Krechetov

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

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

inline A::~A() { }

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

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

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

201
MSN

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

12,4 деструкторов

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

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

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

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

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

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

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