Klasy - dziedziczenie i sprawdzenie "jest czymś"
Ostatnio zmodyfikowano 2014-01-24 17:26
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? |
|
Monika90 |
» 2014-01-23 23:19:36 Do tego służy tablica (najlepiej vector) wskaźników (najlepiej inteligentnych) np.: 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ż) |
|
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. |
|
« 1 » |