Это связано с концепциями covariance and contravariance. Я приведу пример, который, надеюсь, прояснит ситуацию.
Начнем с простой иерархии. Предположим, мы имеем дело с созданием и уничтожением объектов в реальном мире. У нас есть 3D-объекты (например, деревянные блоки) и 2D-объекты (например, листы бумаги). 2D-объект можно рассматривать как трехмерный объект, за исключением незначительной высоты. Это правильное направление подкласса, поскольку обратное неверно; 2D-объекты можно сложить поверх друг друга, что очень сложно в лучшем случае сделать с любыми 3D-объектами.
Что-то, что производит объекты, такие как принтер, является covariant. Предположим, ваш друг хочет заимствовать 3D-принтер, взять десять объектов, которые он производит, и вставить их в коробку. Вы можете дать им 2D-принтер; он будет печатать десять страниц, а ваш друг будет вставлять их в коробку. Однако, если этот друг захотел взять десять 2D-объектов и вставить их в папку, вы не могли бы дать им 3D-принтер.
Что-то, что потребляет предметы, такие как измельчитель, это contravariant. У вашего друга есть папка со страницами, которые она печатала, но она не продавалась, поэтому он хочет ее испортить. Вы можете дать им 3D-измельчитель, например, промышленные, используемые для измельчения таких вещей, как автомобили, и он будет работать нормально; кормление страниц не вызывает никаких трудностей. С другой стороны, если бы он хотел уничтожить коробку предметов, которые он получил раньше, вы не могли бы дать ему 2D-измельчитель, так как объекты могут не вписаться в слот.
Массивы: virtualant; они оба потребляют объекты (с назначением) и производят объекты (с доступом к массиву). В качестве примера такого отношения возьмите какой-нибудь факсимильный аппарат. Если вашему другу нужен факсимильный аппарат, ему нужен точный вид, который они запрашивают; они не могут иметь супер- или подкласс, поскольку вы не можете вставлять 3D-объекты в слот для 2D-бумаги, и вы не можете привязывать объекты, созданные 3D-факсимильным аппаратом, в книгу.
Полиморфизм работает только через указатели, а элементы массива не являются указателями, они являются типами значений. Вам понадобится массив указателей и их удаление по отдельности. (или вектор интеллектуальных указателей) – Galik
Я согласен с комментарием @Galik, но он отлично работает для меня, правильное полиморфное поведение. sh-4.2 $ g ++ -std = C++ 11 -o main * .cpp ~ Производный(): 2 ~ Base(): 1 ~ Производный(): 2 ~ Base(): 1 ~ Производный(): 2 ~ Base(): 1 ~ Derived(): 2 ~ Base(): 1 – instance
Это не будет работать, поскольку массивы используют указатель aritmetic для доступа к массивам, которые в вашем случае являются sizeof (Base), с другой стороны, один элемент в вашем array - sizeof (Derived), поэтому при доступе к массиву el вы попадете в неправильный адрес. – user3655463