Не следуйте слепо правилам. То есть следуйте правилам, но не делайте этого вслепую.
Единственный случай, когда виртуальный деструктор действительно необходим, — это когда объект удаляется через его базовый указатель объекта. Эмпирическое правило обобщает и упрощает это условие: если объект может быть удален с помощью указателя на его базовый объект, то он будет использоваться полиморфно; полиморфный объект, скорее всего, будет иметь виртуальные функции, а объект, имеющий виртуальные функции, скорее всего, будет использоваться полиморфно; поэтому объекту с виртуальными функциями, скорее всего, понадобится виртуальный деструктор.
Это все прекрасно и ладно, правило в основном работает, но есть более важный и более фундаментальный факт, который редко упоминается, отчасти потому, что такие правила действительно работают. Дело в том, что есть ценностные объекты, а есть объекты другого вида, у которого нет хорошего названия, но я буду называть их сущностноподобными объектами. Сущностно-подобные объекты имеют идентичность отдельно от своего значения, они используют семантику ссылок, их нельзя копировать без веских причин (например, для создания отдельной идентичности), к ним, вероятно, будет осуществляться полиморфный доступ и т. д. Ценностно-подобные объекты не имеют идентичности помимо их ценности, их можно свободно копировать, их нельзя использовать полиморфно и т. д. Они настолько разные, что стоило бы иметь разные ключевые слова для их классов! Когда вы разрабатываете свой класс, вы должны решить, к какой категории он принадлежит. Тогда ваш вопрос решается сам собой. Сущности получают виртуальные деструкторы, а значения — нет.
person
n. 1.8e9-where's-my-share m.
schedule
24.03.2013