Tworząc wektor:
std::Vector< typ_do_przechowania> nazwa_wektora
W takim razie, nie widzę problemu, aby zrobić wektor wskaźników na klasę abstrakcyjną:
vector<Zwierz*> zwierzoki;
Dopóki nie tworzymy obiektu na podstawie klasy abstrakcyjnej, możemy spać spokojnie :)
Pamiętaj aby "wpychać" do wektora wskaźniki (lub adresy &) a nie same obiekty.
Pies reksio;
zwierzoki.push_back( &reksio );
Jest jeszcze taki cud, uwaga uwaga:
zwierzoki.push_back( new Pies );
Możemy to zrobić pod warunkiem, że klasa "Pies" posiada konstruktor domyślny. Zapis taki zadziała, bo operator "new" zwraca adres obiektu, który tworzy.
Dzięki temu nie tworzymy obiektu "reksio" lokalnego, tylko dynamicznie. Jest to bardzo ważne, bo po opuszczeniu funkcji pamięć jest zwalniana. U ciebie jest main(), ale gdyby to była inna funkcja, to po jej opuszczeniu w wektorze byłby adres, który może do Ciebie już nie należeć. Jeśli więc możemy, to przesyłajmy adresy obiektów dynamicznie utworzonych. One nigdy nie znikają bez naszej wiedzy.
Pozdrawiam :)