[C++] Program zawierający dziedziczenie i funkcje wirtualne

FantaZy
Użytkownik
Użytkownik
Posty: 53
Rejestracja: 22 lut 2011, o 23:33
Płeć: Mężczyzna
Lokalizacja: z domu

[C++] Program zawierający dziedziczenie i funkcje wirtualne

Post autor: FantaZy »

Cześć, mam taki kłopot. Na zajęcia z programowania prowadzący kazał zrobić jakiś program, w którym będzie wykorzystywane dziedziczenie i funkcje wirtualne. Niestety, na tym kończy się całe polecenie. Jestem mocno początkujący, nie wiem co by to mógł być za program, abym dał radę go napisać i jednocześnie żeby zawierał te elementy. Czy ktoś mógłby coś zaproponować, żeby to miało sens, samemu ciężko jest mi sobie coś narzucić.
z góry dzięki za pomoc.
Rjiuk
Użytkownik
Użytkownik
Posty: 22
Rejestracja: 6 sty 2012, o 13:50
Płeć: Mężczyzna
Lokalizacja: Mszczonów
Podziękował: 1 raz
Pomógł: 1 raz

[C++] Program zawierający dziedziczenie i funkcje wirtualne

Post autor: Rjiuk »

Jeżeli nie musi być jakiś użytkowy lub coś to możesz zrobić na zasadzie tworzenia zwierzęcia zaczynając od początku. Możesz je dzielić etc. dzięki czemu możesz zrobić dziedziczenie i funkcje wirtualne np
organizm żywy -> ssaki
-> gady , etc
jakis umowny podzial ktory pozwoli ci tylko na pokazanie tych funkcji .

W interakcji z użytkownikiem możesz wypisywać aktualne funkcje typu ( jedz , pij ) jakies pasywne jak oddychaj , i ew można go ewoluwać np z ssak -> pies i dojdzie jakas funkcje szczekanie czy coś + odziedziczy wszystko po ssaku
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[C++] Program zawierający dziedziczenie i funkcje wirtualne

Post autor: kadiii »

EDIT: Wrzucam chociaż widzę, że kolega Rjiuk już odpowiedział (i też zwierzęcy przykład ) - myślę, że nadmiar informacji w tym wypadku nie zaszkodzi

Musisz pomyśleć nad jakimś abstrakcyjnym bytem z jakąś akcją (Twoja klasa bazowa z metodą wirtualną). Następnie tworzysz obiekt(y), które modelują konkretne byty wykonujące akcję z klasy bazowej w konkretny dla tego obiektu sposób. Przykład :
Obiekt abstrakcyjny : Zwierzę
Metoda wirtualna : dajGłos()

Obiekt konkretny 1 : Pies (rozszerza klasę Zwierzę)
Implementuje metodę dajGłos() : return "Hau Hau";

Obiekt konkretny 2 : Kot (rozszerza klasę Zwierzę)
Implementuje metodę dajGłos() : return "Miau Miau";

Teraz jeżeli w programie wywołasz na obiekcie klasy Zwierzę metodę dajGłos otrzymasz w zależności od typu obiektu odpowiedni komunikat.
Generalnie definiujemy taką klasę bazową(np.Zwierzę) z metodą wirtualną (np.dajGłos) aby mieć gwarancję, że wszystkie obiekty potomne(np. Pies, Kot) będą miały zaimplementowaną metodę klasy bazowej. Dzięki temu w czasie wykonywania programu aplikacja zadba o wykonanie odpowiedniej metody.

Oczywiście to tylko przykład - program możesz napisać dowolny, bardziej go skomplikować, pokombinować różne warianty (np. wielokrotne dziedziczenie). Powodzenia
Rjiuk
Użytkownik
Użytkownik
Posty: 22
Rejestracja: 6 sty 2012, o 13:50
Płeć: Mężczyzna
Lokalizacja: Mszczonów
Podziękował: 1 raz
Pomógł: 1 raz

[C++] Program zawierający dziedziczenie i funkcje wirtualne

Post autor: Rjiuk »

Swoją drogą, większość książek i kursów mówiąca o dziedziczeniu , wirtualach , poliformiźmie etc. daje przykład zwierzęcy oraz często na jego podstawie buduje przykłady. Gorąco polecam poszperać w necie za takimi rzeczami z kodem, jeżeli jesteś początkujący to może Ci się coś więcej rozjaśni niż tylko z naszych wypowiedzi
FantaZy
Użytkownik
Użytkownik
Posty: 53
Rejestracja: 22 lut 2011, o 23:33
Płeć: Mężczyzna
Lokalizacja: z domu

[C++] Program zawierający dziedziczenie i funkcje wirtualne

Post autor: FantaZy »

Hej, dzięki za odpowiedzi :)
Przykład ze zwierzętami był w Symfonii C++ :) .
Sam wpadłem na pomysł taki, aby stworzyć coś a'la Football Manager'a.
Class junior
-imie,nazwisko
-wiek
class senior:junior
-liga
-klub
class profesjonalista:senior
-cena
-poprzedni klub

to chyba też niezły pomysł? Można zrobić dość ubogą wersję, a możnaby ten program później mocno rozbudować o rozgrywanie meczy i przypisanie zawodnikom umiejętności(np. w sakali 0-100) i na podstawie rachunku prawdopodobieństwa losować wyniki meczy i móc awansować piłkarzy z juniorów do seniorów itd itp. :)
Co o tym sądzicie? może macie do tego jakieś dodatkowe pomysły, sugestie, uwagi?
witekkq
Użytkownik
Użytkownik
Posty: 145
Rejestracja: 16 lis 2007, o 09:06
Płeć: Mężczyzna
Lokalizacja: Gniezno
Podziękował: 2 razy
Pomógł: 27 razy

[C++] Program zawierający dziedziczenie i funkcje wirtualne

Post autor: witekkq »

zasadniczo to na razie masz tylko schemat piłkarzy więc to jakiegokolwiek menadżera jeszcze mu brakuje więc sugestii byłoby więcej niż treści
FantaZy
Użytkownik
Użytkownik
Posty: 53
Rejestracja: 22 lut 2011, o 23:33
Płeć: Mężczyzna
Lokalizacja: z domu

[C++] Program zawierający dziedziczenie i funkcje wirtualne

Post autor: FantaZy »

no tak, ale w samej ideii mieści się dość sporo możliwości zastosowania wspomnianych elementów języka.
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[C++] Program zawierający dziedziczenie i funkcje wirtualne

Post autor: kadiii »

Z punktu widzenia rzeczywistości twój model nie ma wiele wspólnego z rzeczywistością. Powinna być jak już klasa bazowa Piłkarz z danymi wspólnymi dla wszystkich i po niej powinny dziedziczyć Junior, Senior i Profesjonalista (są to obiekty na tym samym poziomie abstrakcji - ewentualnie klasa Profesjonalista może rozszerzać Seniora jako jego rodzaj [w domyśle istniejąca alternatywa klasa Amator]). Zresztą gdyby naprawdę dobrze się przyjrzeć to wszyscy oni mają w większości wspólne cechy i jedynie ich reprezentacja jest inna - np. Piłkarz ma podajPensję() i w implementacji Amatora można dać 0 a w implementacji Profesjonalisty jakaś kwota albo "tajne".
FantaZy
Użytkownik
Użytkownik
Posty: 53
Rejestracja: 22 lut 2011, o 23:33
Płeć: Mężczyzna
Lokalizacja: z domu

[C++] Program zawierający dziedziczenie i funkcje wirtualne

Post autor: FantaZy »

kadiii to ma być projekt z przedmiotu Programowanie Komputerów. Także, to że będzie się to nieco rozmijać z rzeczywistością nie jest akurat najważniejsze. Chociaż dlaczego nie mogę sobie założyć, że junior czy senior nie grają w moim klubie za darmo? (brak pola: pensja). Mogę dodać pole wzrost i waga, a u juniorów pominąć, bo powiedzmy, że w tej kategorii nie będzie to aż tak istotne. Wiem, że to trochę naciągane ale program musi też spełniać pewne założenia merytoryczne z punktu widzenia języka C++ .
witekkq
Użytkownik
Użytkownik
Posty: 145
Rejestracja: 16 lis 2007, o 09:06
Płeć: Mężczyzna
Lokalizacja: Gniezno
Podziękował: 2 razy
Pomógł: 27 razy

[C++] Program zawierający dziedziczenie i funkcje wirtualne

Post autor: witekkq »

myślę że temat dziedziczenia jesteś w stanie na tym przykładzie dobrze poznać
i w trakcie pisania sam dojdziesz co by tutaj można jeszcze dodać, warto spisać sobie jakie możliwości dają klasy, dziedziczenie, funkcje abstrakcyjne, pola private i public i zrobić tak żeby z wszystkiego skorzystać, chociaż czasami będzie to ("nie rzeczywiste") i naciągane do bólu
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[C++] Program zawierający dziedziczenie i funkcje wirtualne

Post autor: kadiii »

Zrobisz jak będziesz uważał - człowiek uczy się w końcu na błędach. Tworzenie jednak takich "zdeformowanych" klas, w których pomijamy jakieś elementy bo wiem, że akurat z nich dla tego obiektu nie skorzystamy w większości przypadków jest błędem programistycznym - blokujesz tym samym mechanizm polimorfizmu dla innych obiektów! A przecież masz to przećwiczyć w tym projekcie.
Załóżmy hipotetycznie, że pomijasz w Juniorach pole wzrost i waga. Teraz masz grupę piłkarzy i chciałbyś wypisać ich wzrost i wagę. I co teraz ? - w Twoim przypadku musisz sprawdzać za każdym razem czy dany obiekt jest instancją klasy Junior. A co jeśli takich pominięć chcemy zrobić więcej - mnożymy kolejne warunki. Oczywiście mogą zdarzyć się przypadki pól stricte związanych z jakąś klasą - trzeba jednak pamiętać, że tracimy wtedy ten cenny mechanizm polimorfizmu. Gdyby iść krok dalej jeżeli koniecznie chcemy pominąć dla danej klasy jakieś parametry to lepiej stworzyć klasę abstrakcyjną bez tego parametru a następnie abstrakcyjną klasę potomną z tym parametrem. Mamy dzięki temu możliwość korzystania z polimorfizmu dla klas rozszerzających klasę abstrakcyjną z parametrem a dla tych dla których koniecznie nie chcemy używać dziedziczymy po klasie nadrzędnej.

Przykład:
A abstrakcyjna
B dziedziczy po A i również jest abstrakcyjna oraz dodaje parametr x
C, D, E - dziedziczą po B i implementują metody z A oraz mają parametr x
F - dziedziczy po A i implementuje metody z A - nie posiada parametru x
Co zyskujemy :
Klasy C,D,E,F mają pełen polimorfizm na metodach z A
Klasy C,D,D mają polimorfizm na metodach z B (w tym parametr x)

Warto się zastanowić szczególnie, że masz mało złożone programy - jak nauczysz się dobrych nawyków i programowania OO to z większymi programami będzie mniej kłopotów. No, ale Twój wybór.
FantaZy
Użytkownik
Użytkownik
Posty: 53
Rejestracja: 22 lut 2011, o 23:33
Płeć: Mężczyzna
Lokalizacja: z domu

[C++] Program zawierający dziedziczenie i funkcje wirtualne

Post autor: FantaZy »

kadiii, masz rację.
hmm... spróbuję więc klasę tego typu
class junior
-imie
-nazwisko
-wiek
-waga
-wzrost
-umiejętności.skill(stworzę to jako obiekt klasy skill, o której niżej)
-pozycja


class profesjonalista:junior
-cena
-poprzedni klub


class skill
-atak
-obrona
-bramka
-ogólne

ten podział chyba były już bardziej prawidłowy?
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[C++] Program zawierający dziedziczenie i funkcje wirtualne

Post autor: kadiii »

Tak, ten podział jest nieco lepszy od poprzedniego.
Nadal jednak widać, że nie bardzo rozumiesz pojęcie dziedziczenia. Otóż w dziedziczeniu nie chodzi o to żeby wyjść od klasy, która zawiera najmniej elementów i rozszerzać je klasami, które zawierają ich więcej. Do tego używa się agregacji i jest to pojęcie wręcz przeciwstawne do dziedziczenia. Dziedziczeni musi(powinno) mieć logiczne uzasadnienie i opierać się na również na logicznym nazewnictwie(co jest ze sobą ściśle powiązane). Masz tę swoją klasę Junior. Rozszerzając ją w klasie Profesjonalista twierdzisz nie mniej, nie więcej, że każdy profesjonalista jest Juniorem. Co na to seniorzy? Jeżeli już idziesz w tę stronę to :
Junior -> JuniorProfesjonalista , Senior -> SeniorProfesjonalista.
Junior -> JuniorAmator, Senior -> SeniorAmator
dochodzisz do tego, logicznie jest to poprawne. No, ale chwila może odwrócić sytuację:
Profesjonalista -> JuniorProfesjonalista , Profesjonalista -> SeniorProfesjonalista
Amator -> JuniorAmator , Amator -> SeniorAmator
Oba rozwiązania są słuszne i można je użyć w zależności od tego co chcemy wysunąć jako wyznacznik - wiek, czy może tryb uprawiania sportu. Generalnie warto by zadać pytanie czy nie rozbudować jeszcze struktury - ogólna abstrakcyjna klasa Piłkarz byłaby tu idealnie na miejscu. Dzięki temu nie łączysz bezpośrednio wieku z trybem, ale masz pośrednią klasę dla rodzaju gry (tu się nie upieram, chodzi o to, że im więcej pokombinujesz tym lepiej zrozumiesz). Powodzenia i nie ograniczaj się w rozsądnej rozbudowie programu - zaprocentuje w przyszłości na pewno.
ODPOWIEDZ