В первом альтернативном варианте (удалить объект), если статический тип удаляемого объекта отличается от его динамического типа, статический тип должен быть базовым классом динамического типа операнда и статический тип должен иметь виртуальный деструктор, иначе поведение не определено. Во втором варианте (удалить массив), если динамический тип удаляемого объекта отличается от его статического типа, поведение не определено.
Краткий обзор статических и динамических типов:
Код: Выделить всё
struct B{ virtual ~B(){} };
struct D : B{};
B* p = new D();
[Пример: если указатель p , статический тип которого — «указатель на класс B», указывает на объект класса D, производный от B, динамический тип выражения *p > это «
Код: Выделить всё
D
Теперь, глядя на цитату в наверху, это будет означать, что следующий код вызывает неопределенное поведение, если я правильно понял, независимо от наличия виртуального деструктора:
Код: Выделить всё
struct B{ virtual ~B(){} };
struct D : B{};
B* p = new D[20];
delete [] p; // undefined behaviour here
Подробнее здесь: https://stackoverflow.com/questions/617 ... via-a-base