Dziedziczenie
Transkrypt
Dziedziczenie
Metody i Języki Programowania w5, ćw.2 mgr inŜ. Paweł Kośla Dziedziczenie 1. Dziedziczenie a kompozycja. Dziedziczenie – umoŜliwia definiowanie i tworzenie specjalizowanych obiektów na podstawie bardziej ogólnych. Kompozycja(agregacja) – tworzenie nowej klasy uŜywając juŜ istniejących klas (jako składowych nowej klasy). Agregacja jest często przedstawiana w opozycji do dziedziczenia, które polega na uszczegółowieniu typu ogólnego w celu utworzenia typu szczególnego. Agregacja nie tworzy podtypu tylko nowy typ. KOMPOZYCJA: DZIEDZICZENIE class KlasaA { metoda_A(); } class KlasaA { metoda_A(); } class KlasaB { KlasaA a; metoda_B(); } class KlasaB : public KlasaA { metoda_B(); } main() { KlasaB ob; ob.a.metoda_A(); ob.metoda_B(); } main() { KlasaB ob; ob.metoda_A(); ob.metoda_B(); } 2. Modyfikatory dostępu private – atrybut lub metoda z takim modyfikatorem moŜe być wywoływana przez metody tej klasy. protected – moŜe być wywoływana przez metody tej klasy lub klas pochodnych. public – przez „kogokolwiek”. 3. Rodzaje dziedziczeń ”class KlasaB : public KlasaA” prywatne – wszystkie składowe klasy podstawowej stają się składnikami prywatnymi w klasie pochodnej. chronione – prywatne będą prywatnymi, a chronione i publiczne staną się chronionymi. publiczne – dostęp będzie taki sam jak w klasie podstawowej. Metody i Języki Programowania w5, ćw.2 mgr inŜ. Paweł Kośla 4. Nadpisywanie metod Metody klasy podstawowej mogą być modyfikowane w klasie pochodnej. class KlasaA { public: void metoda_A() { cout<<”metoda klasy podstawowej”; } } class KlasaB : public KlasaA { void metoda_A() { cout << „nadpisana metoda”; } } 5. Polimorfizm, rzutowanie w górę rzutowanie w górę - oznacza konwersję typu pochodnego (klasy pochodnej) na typ bazowy (klasę bazową). polimorfizm - to wykazywanie przez metodę róŜnych form działania w zaleŜności od tego jaki typ obiektu jest wskazywany przez wskaźnik lub referencję (pomijając typ wskaźnika lub referencji). metoda wirtualna (zadeklarowana przy uŜyciu słowa kluczowego virtual) - pozwala w klasach pochodnych zastępować implementację metod dostarczonych przez klasę bazową. Kompilator dba o to by metoda zastępująca była wywoływana zawsze gdy obiekt na którego rzecz ma ona być wywołana naleŜy do klasy pochodnej, nawet wtedy gdy obiekt ten jest wskazywany nie przez wskaźnik do klasy pochodnej a przez wskaźnik do klasy bazowej. Pozwala to zastępować w klasach pochodnych algorytmy uŜyte w klasach bazowych innymi algorytmami, nawet gdy uŜytkownik nie wie o tym, Ŝe wywołuje klasę pochodną. class KlasaA { virtual metoda_A() { cout<<”metoda klasy podstawowej”; } } class KlasaB : public KlasaA { metoda_A() { cout<<”metoda z klasy pochodnej”; } } main() { KlasaA * wsk; KlasaB obiekt; wsk = &obiekt; //wskaźnik typu klasy A , ale wskazujący na obiekt klasy B wsk->metoda_A(); // „metoda z klasy pochodnej” // gdyby nie było „virtual” metoda_A wywołana // byłaby jako metoda klasy wskaźnika } Metody i Języki Programowania w5, ćw.2 1. 2. 3. 4. 5. mgr inŜ. Paweł Kośla Ćwiczenie: Stwórz klasę „Baza” z metodą „metoda_A()” oraz klasę „Pochodna” z metodą „metoda_B()”. Klasa pochodna (publicznie) dziedziczy po klasie bazowej. Odwołaj się do metod za pomocą obiektu klasy pochodnej. Dodaj trzy atrybuty (public, protected i private) do klasy bazowej np. zmienna_publiczna, zmienna_chroniona, zmienna_prywatna. Sprawdź moŜliwość dostępu do tych zmiennych z wnętrza metody klasy pochodnej, oraz z funkcji main za pomocą obiektu klasy bazowej. Sprawdź punkt 2 ale zastosuj dziedziczenie prywatne. Stwórz w klasie pochodnej metodę „metoda_A()” (taki sam nagłówek jak w klasie bazowej) ale zmodyfikuj ciało metody. Sprawdź działanie metody_A() na obiekcie klasy pochodnej. Utwórz hierarchię klas: Figura double pole char * nazwa void wyswietl() Kolo double promien void oblicz_pole() Prostokat double a double b void oblicz_pole() Kwadrat double bok void oblicz_pole() - Stwórz obiekty tych klas i sprawdź działanie metod. - Zastanów się jak moŜna inaczej przedstawić tą hierarchię. Dodaj metodę wirtualną w klasie bazowej (virtual void oblicz_pole()). Stwórz wskaźnik do klasy Figura i przypisz mu nowy obiekt klasy pochodnej. Sprawdź działanie metody. Następnie usuń słowo „virtual” i zaobserwuj zmiany.