Это неправильно писать:
class A {
public:
virtual ~A() = 0;
};
для абстрактного базового класса?
По крайней мере, это компилируется в MSVC ... Будет ли сбой во время выполнения?
Это неправильно писать:
class A {
public:
virtual ~A() = 0;
};
для абстрактного базового класса?
По крайней мере, это компилируется в MSVC ... Будет ли сбой во время выполнения?
Ответы:
Да. Вам также нужно реализовать деструктор:
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
};