Twoja dwuwymiarowa tablica zaciemnia ci zrozumienie tego problemu.
Uprośćmy go więc.
Spójrz na taki kod
Obj obj1 = Object1();
Obj obj2 = Object2();
Czy ten kod się skompiluje i dlaczego nie?
Kod się nie skompiluje dlatego, że klasa Object1/2 nie jest klasą Obj.
Ale jak w takim razie użyć polimorfizmu? Trzeba wprowadzić drobną zmianę, musimy użyć wskaźników.
Obj *obj1 = new Object1();
Obj *obj2 = new Object2();
Jak w takim razie utworzyć tablicę takich obiektów? Dla ułatwienia zdefiniujmy sobie nowy typ (ten krok nie jest potrzebny ale pomoże zrozumieć problem).
using ObjPtr = Obj*;
ObjPtr *tablica = new ObjPtr[2];
tablica[0] = new Object1();
tablica[1] = new Object2();
Dla tablicy dwuwymiarowej zachowujemy się analogicznie
using ObjPtr = Obj*;
ObjPtr **tablica = new ObjPtr*[2];
tablica[0] = new ObjPtr[10];
tablica[1] = new ObjPtr[10];
for (int i=0; i<10; i++) {
tablica[0][i] = new Object1();
tablica[1][i] = new Object2();
}
PS. Biblioteki array i vector są tak samo "bibliotekami zewnętrznymi" jak bibliotek iostream.