Когда не следует использовать виртуальные деструкторы? - PullRequest
92 голосов
/ 19 ноября 2008

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

Ответы [ 12 ]

0 голосов
/ 13 ноября 2010

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

Деструктору не нужно быть виртуальным, если вы не собираетесь наследовать от класса. И даже если вы это сделаете, защищенный не виртуальный деструктор также хорош, если удаление указателей базового класса не требуется .

0 голосов
/ 19 ноября 2008

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

...