С виртуальными деструкторами, я должен явно объявить виртуальный деструктор для каждого подкласса? - PullRequest
14 голосов
/ 10 апреля 2011

У меня есть сценарий, в котором я пишу несколько глубокий объектно-ориентированный код с несколькими слоями абстрактных базовых классов, и мне интересно, нужно ли мне явно объявлять деструктор для каждого из них.

Будет ли компилятор создавать виртуальный по умолчанию, или мне придется сообщить об этом?

Ответы [ 3 ]

11 голосов
/ 10 апреля 2011

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

Компилятор GNU GCC даже выдает предупреждение, если у вас есть иерархия классов, а ваш базовый класс не объявляет деструктор виртуальным, потому что вы, скорее всего, хотите, чтобы он был.

5 голосов
/ 10 апреля 2011

Ответ - нет.Единственное уместное требование здесь состоит в том, что классы с vtable (, т.е. , по крайней мере с одной виртуальной функцией) должны иметь по крайней мере один виртуальный деструктор где-нибудь в их цепочке наследования.Обычно это означает, что ваш базовый базовый класс будет содержать пустой виртуальный деструктор.

3 голосов
/ 10 апреля 2011

В общем, если какая-то функция объявлена ​​виртуальной в базовом классе, нет необходимости явно объявлять ее виртуальной в подклассах. Однако это хорошая практика.

Объявление деструкторов в подклассах как виртуальных явно не дает вам серьезных преимуществ, поэтому, если вы не хотите писать еще один виртуальный, не делайте этого.

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