массив из derived1
объектов (или derived2
объектов) не может быть интерпретирован как массив из base
объектов.Массивы не являются полиморфными.Только автономный объект может быть полиморфным, то есть derived1
имеет отношение IS-A с base
.Но array of derived1
не имеет отношения IS-A с array of base
.Ни один из ваших массивов (ни classAry1
, ни classAry2
) действительно не может "работать".
Другими словами, этот
base *classAry1 = new derived1[3];
base *classAry2 = new derived2[2];
уже не имеет никакого смысла, даже если это формально правильно сформированный код.
Первый массив "работает"просто случайно.Поведение вашего кода не определено, даже когда вы работаете с classAry1
.
Если вы хотите иметь массив (или контейнер), в котором хранятся полиморфные сущности, вы должны хранить указатели для реальных объектов в этом массиве, вместо хранения самих реальных объектов.
В вашем конкретном случае код можно переписать следующим образом.(Это выглядит не очень хорошо, и я просто делаю это, чтобы проиллюстрировать принцип, поскольку, не зная вашего полного намерения, трудно выбрать лучший подход)
int main(){
derived1 *d1s = new derived1[2];
base **classAry1 = new base *[2];
classAry1[0] = &d1s[0];
classAry1[1] = &d1s[1];
derived2 *d2s = new derived2[2];
base **classAry2 = new base *[2];
classAry2[0] = &d2s[0];
classAry2[1] = &d2s[1];
classAry1[0]->setInner(1,3);
classAry1[1]->setInner(10,7);
std::cout << classAry1[0]->doStuff() << std::endl;;
std::cout << classAry1[1]->doStuff() << std::endl;
classAry2[0]->setInner(1,3);
classAry2[1]->setInner(10,7);
std::cout << classAry2[0]->doStuff() << std::endl;;
std::cout << classAry2[1]->doStuff() << std::endl;
delete[] classAry2;
delete[] d2s;
delete[] classAry1;
delete[] d1s;
return 0;
}