Это не имеет ничего общего с виртуальным наследованием.
Удаление с помощью указателя типа T, отличного от первоначально выделенного типа D, является неопределенным поведением, если только тип T не является базовым классом D и имеет виртуальный деструктор.
С ++ 14 (как в проекте N3936) §5.3.5/3
” & hellip; если статический тип подлежащего удалению объекта отличается от его динамического типа , статический тип должен быть базовым классом динамического типа объекта, подлежащего удалению, и статический тип должен иметь виртуальный деструктор или поведение не определено.
Виртуальный деструктор используется для идентификации типа D, в частности его размера и его деструктора, и, возможно, его пользовательской функции освобождения (ваш код не имеет этого).
Re
” деструктор по умолчанию должен быть виртуальный манекен функции, не так ли?
Нет, это не так.
Поскольку один руководящий принцип дизайна C++ заключается в том, что вы не платите за то, что не используете, а другой руководящий принцип заключается в том, чтобы оставить программиста под контролем, с возможностью выразить все необходимое (например, для цели двоичной раскладки в памяти).
Вы получаете виртуальный деструктор по умолчанию, только если базовый класс имеет виртуальный деструктор.
Пожалуйста, не отправляйте код с Microsoft '_tmain', если только это не код Visual C++. Это усложняет для других возможность попробовать ваш код и учит новичкам непривычные привычки. Исправлено это для вас. Просто используйте стандартный 'int main()'. –
Что делает 'virtual' в инструкции:' class D: virtual public Base'? Я никогда не видел эту конструкцию (это может быть мое невежество ...). – Chiel
@Chiel https://en.wikipedia.org/wiki/Virtual_inheritance, он используется, когда вы наследуете несколько классов, которые используют одну и ту же базу. – Holt