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


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

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

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

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

2 140

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
};