Вопрос о чистом виртуальном деструкторе

Если мы определяем абстрактный класс, который имеет чистый виртуальный деструктор, почему мы должны дать определение деструктора в абстрактном классе?

Ответ 1

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

Ответ 2

Как отметил Джесси, унаследованные деструкторы всегда вызываются (они вызываются для вас компилятором без возможности переопределить это поведение), поэтому разумно, что виртуальный деструктор должен иметь реализацию. Итак, если чистый виртуальный деструктор должен иметь реализацию, в чем разница между чистым виртуальным деструктором и обычным виртуальным деструктором? Если ваш абстрактный класс имеет только объявленный виртуальный деструктор и другие чистые виртуальные методы, что делает деструктор чистым, кто-то не сможет создать экземпляр абстрактного класса.

Ответ 3

Поскольку стандарт говорит так:

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

Причиной этого является то, что он явно вызван, когда объект производного класса разрушен.

См. также ответы на мой предыдущий вопрос: При каких обстоятельствах выгодно давать реализацию чистой виртуальной функции?

Ответ 4

Только виртуальный dtor может быть объявлен как чистый. Но тогда, поскольку вы добавляете объявление, вы должны реализовать тело dtor. Как уже упоминалось, деструкторы называют их родительским dtor, вплоть до цепочки наследования.