#c #virtual-destructor
#c #virtual-destructor
Вопрос:
У меня есть сценарий, в котором я пишу несколько глубокий объектно-ориентированный код с несколькими уровнями абстрактных базовых классов, и мне интересно, должен ли я явно объявлять деструктор для каждого из них.
Будет ли компилятор генерировать тот, который по умолчанию уже является виртуальным, или мне придется сообщить ему?
Комментарии:
1. Я отмечаю, что в комментарии ниже вы также спрашиваете, нужно ли вам определять деструктор для каждого подкласса. И что ответ отрицательный.
Ответ №1:
Деструктор по умолчанию не является виртуальным. Если вы объявите деструктор вашего базового класса как виртуальный, деструкторы подклассов будут переопределены и, следовательно, также будут виртуальными, даже без явного объявления их таковыми.
Компилятор GNU GCC даже выдает предупреждение, если у вас есть иерархия классов и ваш базовый класс не объявляет деструктор виртуальным, потому что вы, скорее всего, хотите, чтобы это было так.
Комментарии:
1. Вы, вероятно, имели в виду деструктор, а не конструктор.
2. gcc выдает предупреждение только в том случае, если у вас есть виртуальный метод, но деструктор не является виртуальным. Вы можете прекрасно наследовать от класса без каких-либо виртуальных методов, что удобно для метапрограммирования
![]()
3. Следуя этому совету, разумно ли объявлять деструктор по умолчанию как:
~ClassName() override = default
Насколько я понимаю,override
ключевое слово также подразумеваетvirtual
, но, пожалуйста, поправьте меня, если я ошибаюсь!![]()
Ответ №2:
Ответ отрицательный. Единственное релевантное требование здесь заключается в том, что классы с vtable (то есть, по крайней мере, с одной виртуальной функцией) должны иметь по крайней мере один виртуальный деструктор a где-то в своей цепочке наследования. Обычно это означает, что ваш основной базовый класс предоставит пустой виртуальный деструктор.
Ответ №3:
В общем случае, если некоторая функция объявлена виртуальной в базовом классе, нет необходимости явно объявлять ее виртуальной в подклассах. Однако это хорошая практика.
Явное объявление деструкторов в подклассах как виртуальных не дает вам никаких серьезных преимуществ, поэтому, если вы не хотите писать еще один виртуальный, не делайте этого.
Комментарии:
1. Нужно ли мне включать определение в реализацию? Это привело бы к большому количеству пустых деструкторов, загромождающих мой код.