Base *bq = new Der[5];
delete [] bq; // this causes runtime error
Причина в том, что массивы не обрабатываются полиморфно .Поэтому в приведенном выше коде оператор delete
вызывает неопределенное поведение .
§5.3.5 / 3 C ++ 03 говорит
В первом варианте (удаление объекта), если статический тип операнда отличается от его динамического типа,Статический тип должен быть базовым классом динамического типа операнда, а статический тип должен иметь виртуальный деструктор, иначе поведение не определено. Во втором альтернативном варианте ( delete array ), если динамический тип удаляемого объекта отличается от его статического типа, поведение не определено.
Вам повезло, что это дает ошибку времени выполнения, и вы получили возможность узнать о серьезной ошибке в вашем коде как можно скорее.