Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

DZIEDZICZENIE · klasy bazowe i klasy pochodne WyświetlAutora( ) Autor

Podobne prezentacje


Prezentacja na temat: "DZIEDZICZENIE · klasy bazowe i klasy pochodne WyświetlAutora( ) Autor"— Zapis prezentacji:

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

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

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
char *Autor ; void WyswietlAutora ( ) { cout << Autor ; } } ; class Czasopismo : public Publikacja // klasa pochodna char *Cykl ; void WyswietlCykl ( ) { cout << Cykl ; }

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

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
  public private protected  class Elektrownia // klasa bazowa { private: char *Wlasciciel ; protected: int Moc ; public: char *Nazwa ; } ;

9 class Wodna : public Elektrownia // klasa pochodna
char *Rzeka ; protected: char *Spiętrzenie ; } ; class Weglowa : public Elektrownia // klasa pochodna char *RodzajWegla ; 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 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 : virtual public Zwierzeta { } ; class Morskie : virtual public 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ą wykonywane począwszy od szczytu hierarchii

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

15 class Wroblowce : public Ptaki
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
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 bazowych i 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 int LiczbaPasazerow; class Ciezarowe : public Samochody double Ladownosc;

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 klasy bazowej wybierana jest odpowiednia wersja class Figura { public: virtual double Powierzchnia ( ) { } };

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

26 Figura *wskFig; wskFig = new Kolo; 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 char Autor[32]; { Wydawnictwo::Wyswietl( ); cout << "Autor : " << Autor << endl; } };

28 class Czasopismo : public Wydawnictwo
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; /* Tytuł : yyyyyy Cykl : cccccc */

29 –      przeciążenie funkcji wirtualnej nie jest konieczne we 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; }; class Kolo : public Figura double Promien; virtual double Powierzchnia ( ) { return * Promien * Promien; } Figura figa; // błąd Figura *wskFig; // poprawnie wskFig = new Figura; // błąd wskFig = new Kolo; // 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 oprogramowanie wystę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 throw wyraż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 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 ; }

36 ·      sygnalizacja wywołania funkcji
try { blok } int i; double Z, X; try { Z = F1 ( i, X ); } // char Bufor [1024]; // przyjęcie komunikatu { 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 funkcji jest poszukiwana kolejno w funkcjach poprzedzających –     gdy nie ma odpowiedniej sekcji wyjątek obsługuje środowisko wykonawcze lub system operacyjny Pomiary


Pobierz ppt "DZIEDZICZENIE · klasy bazowe i klasy pochodne WyświetlAutora( ) Autor"

Podobne prezentacje


Reklamy Google