Base* p = new Base[n]
создает массив размером n
из Base
элементов, из которых p
затем указывает на первый элемент.Однако Base* p = new Derived[n]
создает массив размером n
с Derived
элементами.p
затем указывает на подобъект Base
первого элемента .p
не не однако ссылается на первый элемент массива, что и требуется для правильного выражения delete[] p
.
Конечно, это было бы возможнопоручить (и затем реализовать), что delete [] p
делает правильные вещи ™ в этом случае.Но что это займет?Реализация должна позаботиться о том, чтобы каким-то образом получить тип элемента массива, а затем морально dynamic_cast
p
к этому типу.Тогда нужно просто сделать delete[]
, как мы уже это делаем.
Проблема в том, что для этого потребуется каждый раз массив типа полиморфных элементов, независимо от того,полиморфизм используется на не.На мой взгляд, это не соответствует философии C ++ - не платить за то, что вы не используете.Но что еще хуже: delete[] p
с поддержкой полиморфизма просто бесполезен, потому что p
почти бесполезен в вашем вопросе.p
- указатель на подобъект элемента и не более;в остальном он совершенно не связан с массивом.Вы, конечно, не можете сделать p[i]
(для i > 0
) с ним.Поэтому не исключено, что delete[] p
не работает.
Подводя итог:
массивы уже имеют множество законных применений.Не позволяя массивам вести себя полиморфно (либо в целом, либо только для delete[]
), это означает, что массивы с полиморфным типом элемента не наказываются за это законное использование, что соответствует философии C ++.
если, с другой стороны, нужен массив с полиморфным поведением, его можно реализовать с точки зрения того, что у нас уже есть.