Вопрос о чисто виртуальном деструкторе - PullRequest
7 голосов
/ 16 июня 2009

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

Ответы [ 4 ]

15 голосов
/ 16 июня 2009

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

9 голосов
/ 16 июня 2009

Потому что стандарт гласит:

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

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

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

9 голосов
/ 16 июня 2009

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

3 голосов
/ 16 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...