1 / 43

DZIEDZICZENIE · klasy bazowe i klasy pochodne

Publikacja WyświetlTytuł( ) Tytuł Cena. Książka WyświetlAutora( ) Autor. Czasopismo WyświetlCykl( ) CyklWydawania. DZIEDZICZENIE · klasy bazowe i klasy pochodne. Potop : Książka. Wprost : Czasopismo. WyświetlTytuł( ) WyświetlAutora( ) Tytuł

ivy
Download Presentation

DZIEDZICZENIE · klasy bazowe i klasy pochodne

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Publikacja WyświetlTytuł( ) Tytuł Cena Książka WyświetlAutora( ) Autor Czasopismo WyświetlCykl( ) CyklWydawania DZIEDZICZENIE ·klasy bazowe i klasy pochodne

  2. Potop : Książka Wprost : Czasopismo WyświetlTytuł( ) WyświetlAutora( ) Tytuł Cena Autor WyświetlTytuł( ) WyświetlCykl( ) Tytuł Cena Cykl ·obiekty klas pochodnych

  3. class id_klasy_pochodnej : tryb_dziedziczenia id_klasy_bazowej { ciało_klasy_pochodnej };

  4. ·dziedziczenie pojedyncze class Publikacja // klasa bazowa { public: char *Tytul ; float Cena ; void ZmianaCeny ( float NowaCena ) { Cena = NowaCena ; } void WyswietlTytul ( ) { cout << Tytul ; } } ;

  5. class Ksiazka : public Publikacja // klasa pochodna { public: char *Autor ; void WyswietlAutora ( ) { cout << Autor ; } } ; class Czasopismo : public Publikacja // klasa pochodna {public: char *Cykl ; void WyswietlCykl ( ) { cout << Cykl ; } } ;

  6. ·dziedziczenie wielokrotne class Samolot // klasa bazowa { public: char *RodzajNapedu ; int Zasieg ; } ; class Transport // klasa bazowa { public: int LiczbaPasazerow ; intLadownosc ; } ;

  7. class SamolotPasazerski :public Samolot, public Transport // klasa pochodna { char *LiniaLotnicza ; } ; RodzajNapedu odziedziczone z klasy Samolot, Zasieg odziedziczone z klasy bazowej Samolot, LiczbaPasazerow odziedziczone z klasy bazowej Transport, Ladownosc odziedziczone z klasy bazowej Transport, LiniaLotnicza składowa specyficzna klasy SamolotPasazerski

  8. ·prywatne i powszechne klasy bazowe publicprivateprotected classElektrownia// klasa bazowa { private: char*Wlasciciel ; protected: int Moc ; public: char *Nazwa ; } ;

  9. class Wodna : public Elektrownia// klasa pochodna { public: char *Rzeka ; protected: char *Spiętrzenie ; } ; class Weglowa : public Elektrownia// klasa pochodna { public: char *RodzajWegla ; protected: int EmisjaCO2 ; } ;

  10. tryb dziedziczenia bazowa public protected private public public protected private protected protected protected private private --------- pochodna

  11. ·zmiana charakteru dziedziczonych składowych class KlasaBazowa {public: int AtrybutCzwarty ; int AtrybutPiaty ; }; class KlasaPochodna :protected KlasaBazowa { public: KlasaBazowa :: AtrybutCzwarty ; }; /* składowa AtrybutCzwarty odziedziczona z klasy bazowej zostanie dołączona do sekcji public zamiast do sekcji protected */ /* składowa AtrybutPiaty zostanie dołączona do sekcji protected */

  12. ·wirtualne klasy bazowe (w grafach dziedziczenia) class Zwierzeta { public: char *NazwaGatunkowa ; } ; class Ssaki : virtualpublic Zwierzeta { .............. } ; class Morskie : virtualpublic Zwierzeta { .............. } ; class Orka : public Ssaki, public Morskie { .............. } ; /* składowa NazwaGatunkowa zostanie odziedziczona tylko 1 raz */

  13. ·tworzenie obiektów klas pochodnych: Elektrownia E1; // bazowa Wodna EWo1; // pochodna Weglowa EWe1; // pochodna ·konstruktory są wykonywanepocząwszyod szczytu hierarchii

  14. a)bezargumentowekonstruktory klas bazowych class Ptaki { public: char Gromada[6]; bool Wedrowny; Ptaki( ) { strcpy(Gromada, "Aves"); Wedrowny = false; } };

  15. class Wroblowce : public Ptaki {public: char Rzad[14]; Wroblowce ( ) { strcpy(Rzad, "Passeriformes"); } }; class Pokrzewka : public Wroblowce {public: char Rodzina[10], Gatunek[32]; Pokrzewka (char* gatunek) { strcpy (Rodzina, "Sylviidae"); strcpy (Gatunek, gatunek); Wedrowny = true; } }; Pokrzewka Piegza ("Sylvia curruca"); KonBaz

  16. b)konstruktory klas bazowych z argumentami class PojazdyKolowe { public: int LiczbaKol; PojazdyKolowe ( int ile ) { LiczbaKol = ile; } };

  17. class PojazdySpalinowe : public PojazdyKolowe { public: double MocSilnika; PojazdySpalinowe(int kola, int moc): PojazdyKolowe( kola ) { MocSilnika = moc; } };

  18. class SamochodyOsobowe : public PojazdySpalinowe {public: int LiczbaPasazerow; SamochodyOsobowe(int kola, double moc, int pasazerowie) : PojazdySpalinowe ( kola, moc ) { LiczbaPasazerow = pasazerowie; } }; SamochodyOsobowe auto1(4, 75, 5); KonArg

  19. ·odwołania do składowych klas pochodnych –      ogólnie tak jak do składowych zwykłych klas –      dziedziczenie składowych o takich samych identyfikatorach class B1 { public: char* Nazwa; }; class B2 : public B1 { public: char* Nazwa; }; class P1 : public B2 { ...... }; P1 obiekt; obiekt.Nazwa; // błąd, niejednoznaczne obiekt.B1::Nazwa; // poprawnie obiekt.B2::Nazwa; // poprawnie

  20. ·funkcje zaprzyjaźnione: w funkcji zaprzyjaźnionej z klasą bazową nie można odwoływać się do składowych prywatnych i chronionych klasy pochodnej ·konwersja obiektów klas bazowychi klas pochodnych –      wskaźnik obiektu klasy bazowej można zastąpić wskaźnikiem obiektu klasy pochodnej (dziedziczenie powszechne, klasa bazowa bez składowych prywatnych)

  21. class Samochody { public: int MocSilnika; }; class Osobowe : public Samochody { public: int LiczbaPasazerow; }; class Ciezarowe : public Samochody { public: doubleLadownosc; };

  22. Samochody *wskSam; wskSam = new Osobowe; wskSam = new Ciezarowe; wskSam->MocSilnika; // poprawnie wskSam->Ladownosc; // błąd ((Ciezarowe*)wskSam)->Ladownosc; //poprawnie

  23. ·funkcje wirtualne Samochody* Ewidencja[1000]; // osobowe i ciężarowe // w dowolnej kolejności class Samochody { public: int MocSilnika; bool Osobowy; // identyfikacja }; if (Ewidencja[i]->Osobowy) ((Osobowy*)Ewidencja[i]->LiczbaPasazerow; else ((Ciezarowy*)Ewidencja[i]-> Ladownosc; /* żmudne */

  24. ·funkcja wirtualna : –      zdefiniowana w klasie bazowej –      redefiniowana w klasach pochodnych –      przy wywołaniu poprzez wskaźnik klasybazowej wybierana jest odpowiednia wersja class Figura { public: virtualdouble Powierzchnia ( ) { } };

  25. classKolo : public Figura { public: double Promien; virtual double Powierzchnia ( ) { return 3.1415 * Promien * Promien; } }; class Prostokat : public Figura { public: double BokA, BokB; virtual double Powierzchnia ( ) { return BokA * BokB; } };

  26. Figura *wskFig; wskFig = newKolo; wskFig->Powierzchnia( ); // πr2 wskFig = new Prostokat; wskFig->Powierzchnia( ); // ab

  27. –      wywoływanie funkcji wirtualnej z klasy bazowej class Wydawnictwo { public: char Nazwa[32]; virtual void Wyswietl( ) {cout << "Tytuł : " << Nazwa << endl;} }; class Ksiazka : public Wydawnictwo { public: char Autor[32]; virtual void Wyswietl( ) { Wydawnictwo::Wyswietl( ); cout << "Autor : " << Autor << endl;}};

  28. class Czasopismo : public Wydawnictwo { public: char Cykl[32]; virtual void Wyswietl ( ) { Wydawnictwo::Wyswietl( ); cout << "Cykl : " << Cykl << endl;} }; Wydawnictwo * wskWyd; wskWyd = new Ksiazka; wskWyd->Wyswietl( ); /* Tytuł : xxxxxx Autor : zzzzzz */ wskWyd = new Czasopismo; wskWyd->Wyswietl( ); /* Tytuł : yyyyyy Cykl : cccccc */

  29. –      przeciążenie funkcji wirtualnej nie jest koniecznewe wszystkich klasach hierarchii klas –      jeżeli w klasie nie ma redefinicji funkcji wirtualnej,to wykona się funkcja z najbliższej klasy poprzedniej w hierarchii, w której funkcja ta jest przeciążona ·klasy abstrakcyjne –      nie zawierają składowych prywatnych –      nie zawierają definicji funkcji wirtualnych (a tylko ich deklaracje) –      nie tworzy się obiektów tych klas Elek

  30. class Figura { public: virtual double Powierzchnia ( ) = 0; }; classKolo : public Figura {public: double Promien; virtual double Powierzchnia ( ) { return 3.1415 * Promien * Promien; } }; Figura figa; // błąd Figura *wskFig; // poprawnie wskFig = new Figura; // błąd wskFig = newKolo; // poprawnie Figury Pojazdy

  31. Obsługa Wyjątków ·błędy czasu kompilacji ·błędy czasu wykonania – błędy wykrywane sprzętowo – błędy wykrywane przez oprogramowaniewystępujące w funkcjach, sposoby obsługi: –      wyróżniona wartość funkcji (0, -1) –      globalna zmienna biblioteki –      dodatkowy argument funkcji: zmienna, wskaźnik funkcji √

  32. ·obsługa wyjątków w C++ –      zgłoszenie wyjątku –      sygnalizacja wywołania niebezpiecznej funkcji –      sekcje obsługi wyjątków ·zgłoszenie wyjątku throwwyrażenie throw 12 ; // wyjątek typu int throw 1.5 ; // wyjątek typu double throw "Błąd."; // wyjątek typu char* // class OpisBledu ; throw OpisBledu ( );// wyjątek typu // OpisBłędu

  33. /*F1 = sqrt (( A + 3 * k ) / ( A - k – 1 ))*/ double F1 ( int k, double A ) {double L = A + 3 * k, M = A - k - 1 ; if ( M == 0 ) { throw 0; return 0; } if ( L / M < 0 ) { throw -1.0; return 0; } return sqrt( L / M ); }

  34. class BladKomunikatu { public: char SumaKontrolna ; int LiczbaZnakow ; BladKomunikatu ( char Suma, int Dlug) { SumaKontrolna = Suma; LiczbaZnakow = Dlug; } } ;

  35. void TestujKomunikat ( char* Bufor ) { if ( KomunikatPoprawny (Bufor) ) return ; else { BladKomunikatu *pOpisBledu = new BladKomunikatu ( SumaKontrolna( Bufor ), DługoscKomunikatu( Bufor ) ); throw pOpisBledu ; return ; } }

  36. ·sygnalizacja wywołania funkcji try { blok } int i; double Z, X; ......... try { Z = F1 ( i, X ); } // char Bufor [1024]; ............ // przyjęcie komunikatu try { TestujKomunikat ( Bufor ); }

  37. ·sekcje obsługi wyjątków catch ( deklaracja_wyjątku) { blok } try { .......... } catch ( typ1 ) { .......... } catch ( typ2 ) // tylko po try { .......... } ...............

  38. –      typy wyjątków : a. . . . b. identyfikator typu lub identyfikator klasy c. deklaracja argumentu ad a) dla wszystkich wyjątków try { Z = F1 ( i, X ); } catch (...) { cout << " Oj źle! "; ................... }

  39. ad b) zgodnie z typem wartości podanej w zgłoszeniu wyjątku try { Z = F1 ( i, X ); } catch ( int ) { cout << " Dzielenie przez zero! "; ................... } catch ( double ) { cout << " Pierwiastek z ujemnej! "; ................... }

  40. ad c) według typu z przekazaniem wartości double KwadratElementu ( double Tablica [ ],int Rozmiar, int Indeks ) {if ( Indeks >= Rozmiar ) { throw Indeks ; // typ int return 0; } if ( Tablica [ Indeks ] >MAKSYMALNY ) { throw Tablica [ Indeks ] ;// typ double return 0 ; } return Tablica [ Indeks ] * Tablica [ Indeks ] ; }

  41. try { X = KwadratElementu ( Wektor, Długosc, Pozycja ); } catch ( int Indeks ) {cout << ”\n Indeks o wartości ” << Indeks << ” przekracza rozmiar wektora. ” ; } catch ( double Element ) { cout << ”\n Podniesienie wartości ” << Element << ” do kwadratu ” ”spowoduje przekroczenie zakresu liczb” ” typu double. ” ; }

  42. try { TestujKomunikat ( Bufor ) ; } catch ( BladKomunikatu *pOpisBledu ) { cout << ”\n Odebrano bledny ”” komunikat o dlugosci : ” << pOpisBledu -> LiczbaZnakow ; cout << ”\n Bledna suma kontrolna : ” << pOpisBledu -> SumaKontrolna ; delete pOpisBledu ; }

  43. ·hierarchia wyjątków FunkcjaPierwsza  FunkcjaDruga ......  FunkcjaNta // wszystkie funkcje wywołane przez try –     sekcja obsługi wyjątku zgłoszonego w i-tej funkcjijest poszukiwana kolejnow funkcjach poprzedzających –     gdy nie ma odpowiedniej sekcji wyjątek obsługuje środowisko wykonawcze lub system operacyjny Pomiary

More Related