Tworząc tablice dynamicznie 1 wymiarową potrzebujesz wskaźnika o danym typie. Za pomocą operatora new alokujesz pamięć. Operator new zwraca adres pierwszego komórki pamięci. Typ wskaźnika określa o ile bajtów należy przeskoczyć by obejmować kolejną komórę pamięci.
Np.
int *tab=new int[3];
Powyższy zapis tworzy tablice dwu wymiarową. Jeśli chcieli byśmy stworzyć tablicę wskaźników. Tablica ta przechowuje nie wartości a adresy. Wtedy należy użyć konstrukcji wskaźnik na wskaźnik. Tablice wskaźników są często używane, jeśli chcieli byśmy stworzyć tablice dwu wymiarową dynamiczną.
//tworzenie tablicy 2d 3x3
int **tab=new int*[3];//tworzymy tablicę wskaźników
for(int i=0;i<3;i++)
{
tab[i]=new int[3];//do każdego z wskaźników alokujemy pamięć
}
Oczywiście w przypadku tablicy jednowymiarowej wystarczy użyć funkcji delete [] by zwolnić pamięć. W przypadku tablicy 2d wykonali byśmy to w ten sposób.
for(int i=0;i<3;i++)
{
delete [] tab[i];//zwalniamy pamięć na jaką wskazuje każdy z wskaźników
}
//teraz usuwamy właściwą tablice wskaźników
delete [] tab;
Jeśli chodzi o twój program to mamy do czynienia z zjawiskiem zwanym polimorfizmem. Polimorfizm dynamiczny może tylko i wyłącznie zachodzić wtedy kiedy używamy wskaźników. Na logikę Zwierzę to nie Kot ale Zwierze należy do tej samej rodziny co Kot. Dlatego tutaj należy używać wskaźników. Twój kod powinien wyglądać tak, zapominasz o zwalnianiu pamięci.
#include <iostream>
#include <cstdlib>
using namespace std;
class Zwierze {
public:
virtual void daj_glos() {
//
}
};
class Kot : public Zwierze {
public:
void daj_glos() {
cout<<"Miau ";
}
};
class Pies : public Zwierze {
public:
void daj_glos() {
cout<<"Woof ";
}
};
class Krowa : public Zwierze{
public:
void daj_glos() {
cout << "Muuuu";
}
};
int main()
{
Zwierze **tablica = new Zwierze*[3];
tablica[0] = new Kot();
tablica[1] = new Pies();
tablica[2] = new Krowa();
for (int i = 0; i<3; i++) {
tablica[i]->daj_glos();
}
//sprzatamy
for(int i=0;i<3;i++)
{
delete[] tablica[i];
}
delete []tablica;
//system("pause");
return 0;
}
Polimorfizm może istnieć dzięki relacji zwanej dziedziczeniem. To samo co wyżej możesz zrobić z wykorzystaniem kontenerów vector.
#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;
class Zwierze {
public:
virtual void daj_glos() {
//
}
};
class Kot : public Zwierze {
public:
void daj_glos() {
cout<<"Miau ";
}
};
class Pies : public Zwierze {
public:
void daj_glos() {
cout<<"Woof ";
}
};
class Krowa : public Zwierze{
public:
void daj_glos() {
cout << "Muuuu";
}
};
int main()
{
vector<Zwierze *> tablica;
tablica.push_back(new Kot());
tablica.push_back(new Pies());
tablica.push_back(new Krowa());
for(int i=0;i<tablica.size();i++)
{
tablica[i]->daj_glos();
}
return 0;
}