Чисто виртуальный деструктор в 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) синтаксиса qualified-id (5.1).
[Примечание:объявление функции не может обеспечить как чистый спецификатор, так и конец определения Примечание ]
взято прямо из проекта:
struct C { virtual void f() = 0 { }; // ill-formed };