деструктор должен быть виртуальным, если хотя бы один из методов класса является виртуальным
Это практическое правило, которое вытекает из того факта, что когда вы используете виртуальные функции, вы используете полиморфизм во время выполнения и с большей вероятностью сталкиваетесь с ситуациями, когда вам нужно уничтожить класс, который может быть производного типа, когда все вы have - указатель на подобъект базового класса.
Когда вы уничтожаете производный объект, используя delete
для указателя на базовый класс, в базовом классе необходим виртуальный деструктор, чтобы избежать неопределенного поведения . Это единственный раз, когда необходим виртуальный деструктор, и руководство призвано помочь избежать возникновения такой ситуации.
Херб Саттер придерживался принципа, согласно которому деструкторы базового класса (т.е. деструкторы для классов, предназначенных для наследования) должны быть либо public
и virtual
или protected
и не- virtual
. Это дает возможность того, что базовый класс не является точкой в иерархии наследования, которая используется для удаления производных объектов, и вы хотите, чтобы это не произошло непреднамеренно.
Конечно, если у вас есть класс с чистыми значениями, который не является базовым классом, вы мало что можете сделать, чтобы в любом случае остановить людей, производных от него, и затем удалить производный класс с помощью указателя на базу.