Ответ 1
, когда/почему я должен использовать виртуальный деструктор?
Следуйте за Herb Sutters руководство:
Деструктор базового класса должен быть либо открытым, либо виртуальным, либо защищенным и не виртуальным
Можно ли это классифицировать как поведение undefined (мы знаем, что ~ D() не будет вызываться наверняка)?
Это поведение undefined по стандарту, что обычно приводит к тому, что деструктор класса Derived не вызывается и приводит к утечке памяти, но не имеет смысла размышлять над эффектами поведения undefined, потому что стандарт doesn В этом отношении ничего не стоит.
С++ 03 Стандарт: 5.3.5 Удаление
5.3.5/1:
Оператор delete-expression уничтожает наиболее производный объект (1.8) или массив, созданный новым выражением.
удалить-выражение:
:: opt delete cast-expression
:: opt delete [] cast-expression
5.3.5/3:
В первом альтернативе (удалить объект), если статический тип операнда отличается от его динамического типа, статический тип должен быть базовым классом динамического типа операндов, а статический тип должен иметь виртуальный деструктор или поведение undefined. Во втором альтернативе (удалить массив), если динамический тип подлежащего удалению объекта отличается от его статического типа, поведение undefined.73)
Что делать, если ~D()
пусто. Это повлияет на код каким-либо образом?
Тем не менее это undefined Поведение в соответствии со стандартом. Деструктор производного класса, являющийся пустым, может просто заставить вашу программу работать нормально, но это опять-таки реализация определенного аспекта конкретной реализации, технически она по-прежнему является undefined Поведением.
Обратите внимание, что здесь нет gaurantee, который не делает виртуальный виртуальный дескриптор производного класса просто не приводит к вызову деструктора производного класса, и это предположение неверно. В соответствии со стандартом все ставки отключены, как только вы пересечете границу undefined Поведение.
Обратите внимание, что он говорит о undefined Поведении.
Стандарт С++ 03: 1.3.12 undefined поведение [defns.undefined]
например, может возникнуть при использовании ошибочной конструкции программы или ошибочных данных, для которых настоящий международный стандарт не налагает никаких требований. undefined поведение также можно ожидать, если в этом международном стандарте отсутствует описание любого явного определения поведения. [ Примечание: допустимое поведение undefined варьируется от полного игнорирования ситуации с непредсказуемыми результатами, поведения во время перевода или выполнения программы документированным образом, характерным для среды (с выдачей диагностического сообщения или без него), до прекращения перевода или выполнения (с выдачей диагностического сообщения). Многие ошибочные программные конструкции не порождают поведение undefined; они должны быть диагностированы.]
Если только выведенный деструктор не будет вызван, то будет изменен жирным шрифтом в приведенной выше цитате, который явно остается открытым для каждой реализации.