Możesz to dokonać na kilka sposobów. Przedstawię kilka z nich w kodzie.
#include <iostream>
#include <vector>
#include <memory>
class zwierze
{
public:
virtual ~zwierze() = default;
virtual void test ()
{
std::cout << "zwierze" << std::endl;
}
};
class pies:public zwierze
{
public:
virtual void test ()
{
std::cout << "pies" << std::endl;
}
};
class kot:public zwierze
{
public:
virtual void test ()
{
std::cout << "kot" << std::endl;
}
};
template <typename T>
void test(const T &tablica, size_t rozmiar) {
std::cout << "test" << std::endl;
for (size_t i=0; i<rozmiar; i++)
tablica[i]->test();
std::cout << std::endl;
}
int main () {
// surowa tablica
// musisz ręcznie zadbać o usunięcie pamięci
// zaalokowanej dla wszystkich elementów
// i samej tablicy
zwierze **tablica1 = new zwierze *[4];
tablica1[0] = new pies ();
tablica1[1] = new pies ();
tablica1[2] = new kot ();
tablica1[3] = new kot ();
test(tablica1, 4);
// zwolnienie pamięci
for (size_t i=0; i<4; i++)
delete tablica1[i];
delete [] tablica1;
// wektor wskaźników
// musisz ręcznie zadbać o usunięcie pamięci
// zaalokowanej dla wszystkich elementów
std::vector < zwierze * >tablica2;
tablica2.push_back (new pies ());
tablica2.push_back (new pies ());
tablica2.push_back (new kot ());
tablica2.push_back (new kot ());
test(tablica2, 4);
// zwolnienie pamięci
for (size_t i=0; i<4; i++)
delete tablica2[i];
tablica2.clear(); // clear tyko po to, zeby nie trzymac listy nieważnych pointerów
// tablica wskaźników intelignetnych
// elementy zostaną usunięte automatycznie podczas
// ręcznego usuwania tablicy
std::unique_ptr < zwierze > *tablica3 = new std::unique_ptr < zwierze >[4];
tablica3[0].reset (new pies ());
tablica3[1].reset (new pies ());
tablica3[2].reset (new kot());
tablica3[3].reset (new kot());
test(tablica3, 4);
// zwolnienie pamięci
delete [] tablica3;
// wektor wskaźników inteligentnych
// wszystko zostanie automatycznie usunięte
std::vector<std::unique_ptr<zwierze>> tablica4;
tablica4.emplace_back (new pies ());
tablica4.emplace_back (new pies ());
tablica4.emplace_back (new kot ());
tablica4.emplace_back (new kot ());
test(tablica4, 4);
}