polimorfizm, wskaźniki na obiekt

0

Witam. Czytałem kilka artykułów na temat polimorfizmu, wirtualnych destruktorów itd.
Nie do końca rozumiem tą ideę.
[url]http://pl.wikipedia.org/wiki/Destruktor[/url]

class Osoba
{
   public:
      virtual ~Osoba()
      {
         std::cout << "~Osoba(): uruchomiono" << std::endl;
      }
};
 
class Pracownik : public Osoba
{
   public:
      ~Pracownik()
      {
         std::cout << "~Pracownik(): uruchomiono" << std::endl;
      }
};
 
int main()
{
   Osoba *wsk = new Pracownik;
   delete wsk;
 
   return 0;
}

Jaki sens ma w main deklarować Osoba wsk = new Pracownik(i używać tym samym wirtualnego destruktora) zamiast po prostu
Pracownik
wsk = new Pracownik; (wtedy nie trzeba się niczym przejmować)
Po co wskaźnik typu osoba jeśli zamierzamy używać typu pracownik?

1

Cóż,zastąp Osobę i Pracownika na np Samochód oraz konkretne marki (BMW,Nissan etc) to będzie lepiej widoczne.
Zysk z używania polimorfizmu jest taki,że dodając nową markę NIC NIE MUSISZ ZMIENIAĆ W ISNIEJĄCYM JUŻ KODZIE.Dzięki owemu mechanizmowi z automatu użyją się funkcje wirtualne tej nowej marki.

W twoim zaś przykładzie polimorfizm może ułatwić ci życie,kiedy będziesz chciał np dodać nowy typ osoby-Szefa.

1

Spróbuj wsadzić do jednego wektora Pracownika i Bezrobotnego nie dasz rady. Dlatego robi się tak:

std::vector<Osoba*> x;
x.push_back(new Pracownik());
x.push_back(new Bezrobotny());

std::for_each(x.begin(), x.end(), 
	[&](Osoba* o)
{
	//tutaj potrzebne są wirtualne destruktory
	delete o;
}

x.clear();

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.