Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Klasy - dziedziczenie i sprawdzenie "jest czymś"

Ostatnio zmodyfikowano 2014-01-24 17:26
Autor Wiadomość
Chlorek
Temat założony przez niniejszego użytkownika
Klasy - dziedziczenie i sprawdzenie "jest czymś"
» 2014-01-23 22:52:39
Przez długi czas ostatnio pisałem w Java'ie - tam poznałem fajny mechanizm, o którym w C++ nawet nie pomyślałem wcześniej. Chodzi tu mianowicie o taką sytuację:
- Mam klasę powiedzmy Pojazd

- Tworzę 2 klasy dziedziczące od Pojazd, nazwijmy je przykładowo Samochod i Rower

- Klasy Samochod i Rower poza modyfikacją paru funkcji dodają też własne metody, których nie ma w Pojazd

- Tworzę sobie array'a (vector, tablice, cokolwiek innego) i chcę w niej przechować obiekty właśnie tych klas Samochod i Rower (ale ogólnie będzie to array klasy Pojazd) - Można tak w C++? Niby sporo już pisałem rzeczy na klasach, ale czegoś takiego nie próbowałem. Nie utracę podczas castowania dodatkowych danych zawartych w tych klasach?

- Przekazuję utworzony array z obiektami do jakiejś funkcji, która następnie odczyta te obiekty kolejno w pętli i sprawdzi ich typ (czy dany obiekt klasy Pojazd jest Samochodem czy Rowerem - w Java'ie mamy taki prosty sposób na to mianowicie instanceof). I tu moje pytanie - jak to zrobić w C++?

- Teraz chcę znowu zrobić cast z Pojazd na Samochod/Rower w zależności od tego czym jest (na podstawie punktu wyżej)

- Poza wywołaniem metod zwykłych dla Pojazd chcę mieć możliwość użycia metod z Samochod/Rower (logiczne jeśli uda mi się wykonać cast z poprzedniego kroku)



Możliwe jest osiągnięcie tego w C++? Wiem jak bardzo plastyczny jest ten język i myślę, że w jakiś sposób na pewno, nie mam jednak pojęcia o tym zbyt dużego. Poza tym czy są jakieś minusy takiego rozwiązania?
P-103017
Monika90
» 2014-01-23 23:19:36
Do tego służy tablica (najlepiej vector) wskaźników (najlepiej inteligentnych)
np.:
C/C++
std::vector < std::unique_ptr < Pojazd >> pojazdy;

Natomiast jeżeli chodzi o rzutowanie w dół (albo sprawdzanie typu w czasie działania programu), to da się to zrobić za pomocą dynamic_cast i typeid, ale  powszechnie uważa się to za nieeleganckie (w Javie też)
P-103018
Chlorek
Temat założony przez niniejszego użytkownika
» 2014-01-24 17:26:45
Co do "nieeleganckości" tego rozwiązania to nie powiedziałbym tego, wiele dużych, cieszących się uznaniem projektów w Java'ie wykorzystuje taki mechanizm.
W każdym razie wielkie dzięki za odpowiedź, pomogło mi to bardzo.
P-103054
« 1 »
  Strona 1 z 1