polimorfizm, wskaźniki na obiekt

Odpowiedz Nowy wątek
2011-10-20 11:30
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?

edytowany 1x, ostatnio: mimol, 2011-10-20 11:30

Pozostało 580 znaków

2011-10-20 11:40
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.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB, 2011-10-20 11:41

Pozostało 580 znaków

2011-10-20 13:12
ATG
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();
edytowany 1x, ostatnio: ATG, 2011-10-20 13:14

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0