Поскольку вы создаете временный тип Derived
перед созданием копии a
с ним. Вот что в основном происходит:
Derived d(); // Your temporary of type Derived is created
Base a(d); // The temporary is used to call a's copy constructor
d.Derived::~Derived(); // The temporary is destroyed, calling both ~Derived and ~Base
a.Base::~Base(); // The nonvirtual destructor on a is called, so ~Base is called, but not ~Derived
Таким образом, кроме ненужного копирования в начале (которое компилятор может оптимизировать), фактическая ошибка состоит в том, что ~ Base не является виртуальной.
Редактировать
К сожалению, полностью пропустил нарезку, которая происходит, как указано Литб. Вместо этого прочитайте его ответ:)