temat 6
Transkrypt
temat 6
Tematyka wykładów 1. Wprowadzenie. Klasy – cz. 1 2. Klasy – cz. 2 3. 4. 5. 6. 7. 8. Funkcje operatorowe. Wskaźnik this Dziedziczenie Polimorfizm i funkcje wirtualne Szablony Strumienie Tworzenie aplikacji w systemie Windows - Język C++. Programowanie obiektowe - Klasy i obiekty - Budowa i deklaracja klasy. Prawa dostępu - Pola i funkcje składowe - Konstruktor i destruktor - Tworzenie obiektów - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne Dziedziczenie • • • • • • • • Wprowadzenie (co to jest? po co? idea?) Klasa bazowa i pochodna Rodzaje dziedziczenia Definiowanie klasy pochodnej Właściwości dziedziczenia Dziedziczenie publiczne i prywatne Obiekt klasy pochodnej Przesłanianie identyfikatorów Paradygmaty PO Celem programowania obiektowego (PO) jest ograniczenie problemu złożoności programowania poprzez hermetyzację danych oraz wiązanie obiektów w hierarchiczne struktury. • Hermetyzacja danych • Hierarchia klas (obiektów) Idea dziedziczenia ObiektGraficzny kolor linii rodzaj linii grubość linii kolor wypełnienia NIEOKREŚLONY KSZTAŁT OKREŚLONY KSZTAŁT OKREŚLONA METODA RYSOWANIA OKREŚLONY KSZTAŁT NIEOKREŚLONA METODA RYSOWANIA Linia łamana P2 P1 P3 P5 P1 P1 P2 P3 P1, P2, P3 P1, P2, ... , Pn OKREŚLONA METODA RYSOWANIA KształtProstokątny Trójkąt P2 P4 P1, P2 Prostokąt Linia Elipsa P1 P1 P2 P1 P2 P2 Hierarchia klas: od klas bardziej ogólnych do klas szczegółowych. Dziedziczenie - definicja Dziedziczenie to mechanizm tworzenia nowej klasy w oparciu o klasę wcześniej zdefiniowaną. Nowa klasa (klasa pochodna) nie musi być definiowana od podstaw – może korzystać z pól i metod klasy już zdefiniowanej (klasy bazowej). Klasa pochodna to rozszerzenie klasy bazowej. Ważna właściwość: do tworzenia klasy pochodnej nie jest potrzebny dostęp do kodu źródłowego klasy bazowej – wystarczy interfejs i kod binarny klasy (przykład: wykorzystanie bibliotek MFC, VCL itp.). Dziedziczenie jednobazowe Klasa bazowa Klasa pochodna Klasa bazowa Klasa bazowa Klasa pochodna 1 Klasa pochodna 1 Klasa pochodna 2 Klasa pochodna 2 Dziedziczenie wielobazowe Klasa bazowa 1 Klasa bazowa 2 Klasa pochodna Problem: składowe o tych samych nazwach w klasach bazowych. Rozwiązanie: odwołanie za pomocą nazwy kwalifikowanej <nazwa_klasy> :: <nazwa_skladowej> x A B C x A::x B::x Definiowanie klasy pochodnej class <KlasaPochodna> : <SposobDziedzicz> <KlasaBazowa> { }; public private protected PRZYKŁAD: class Lokalizacja // klasa bazowa { < deklaracje i definicje > }; class Punkt : public Lokalizacja { < deklaracje i definicje > }; // klasa pochodna Właściwości dziedziczenia Co może być dziedziczone? • funkcje składowe (metody) • pola składowe Nie wszystkie! W zależności od kwalifikatora dostępu. Co nie jest dziedziczone? • konstruktory • destruktory • funkcje zaprzyjaźnione (zaprzyjaźnienia) • funkcja operatorowa operator = Pola statyczne są wspólne dla wszystkich obiektów wszystkich dziedziczących je klas (wspólne dla całej rodziny klas). Prawa dostępu Kwalifikatory: public, protected, private • Wszystkie składowe zdefiniowane w klasie są dostępne wewnątrz klasy. • Składowe publiczne (public) są dostępne tam, gdzie dostępna jest klasa i są dziedziczone przez klasy pochodne. • Składowe prywatne (private) są dostępne tylko w danej klasie. • Składowe chronione (protected) są dostępne we wszystkich klasach pochodnych. Sposoby dziedziczenia Dziedziczenie publiczne: public Składowe publiczne klasy bazowej są dostępne jako składowe publiczne w klasie pochodnej Składowe zabezpieczone klasy bazowej są dostępne jako składowe zabezpieczone w klasie pochodnej Składowe prywatne nie są dziedziczone Dziedziczenie prywatne: private Składowe publiczne i zabezpieczone są dostępne jako składowe prywatne w klasie pochodnej Składowe prywatne nie są dziedziczone Dziedziczenie publiczne – rozszerzanie możliwości klasy bazowej. Dziedziczenie prywatne – klasy bazowe to „klasy robocze”, „wewnętrzne” z punktu widzenia funkcjonalności, a klasy pochodne są „finalne”. Warianty dziedziczenia Składowe widoczne na zewnątrz klasy class B : public A { public: pubB, pubA protected: proB, proA private: priB }; class A { public: pubA protected: proA private: priA }; class D : protected A { public: pubD protected: proD, pubA, proA private: priD }; class C : private A { public: pubC protected: proC private: priC, pubA, proA }; Warianty dziedziczenia Składowe widoczne na zewnątrz klasy class B : public A { public: pubB, pubA protected: proB, proA private: priB }; class A { public: pubA protected: proA private: priA }; class C : private A { public: pubC protected: proC private: priC, pubA, proA }; Obiekt klasy pochodnej Utworzenie obiektu klasy pochodnej jest poprzedzone utworzeniem obiektu klasy bazowej. Konstruktor klasy pochodnej najpierw wywołuje konstruktor klasy bazowej, a następnie realizuje swoje zadania. Jeżeli klasa bazowa ma kilka konstruktorów, należy wskazać przy użyciu listy inicjalizującej, który z konstruktorów ma zostać wywołany. Kiedy brak tej informacji, zawsze wywoływany jest konstruktor bezparametrowy. Przykład: ABCD.cpp class A { public: A() { } A(int x) { } }; Przykład: ABCD.cpp A Konstruktory: wywoływane są zgodnie z hierarchią klas. public Destruktory: wywoływane są w odwrotnej kolejności. class B: public A Lista inicjalizująca: wywołanie { wybranego konstruktora public: z klasy bazowej A B() { } B(int b) : A(b) { } B(float x) { } }; class C: public B { public: C() { } }; HIERARCHIA KLAS class D: private B { public: D() { } }; B private public D C D C B A Przesłanianie identyfikatorów Jeżeli w klasie pochodnej zdefiniowana jest składowa o takiej samej nazwie jak w klasie bazowej, to następuje przesłonięcie (nie przedefiniowanie) odziedziczonej składowej. W przypadku funkcji, przesłonięcie ma miejsce nawet wtedy, gdy funkcje mają różne argumenty. Przesłonięta składowa jest nadal dostępna w klasie pochodnej przez nazwę kwalifikowaną. Zasady poszukiwania składowych: 1. Nazwa składowej poszukiwana jest w klasie bieżącej (określonej przez typ obiektu). 2. Jeżeli nie zostanie znaleziona, nazwa składowej jest poszukiwana w kolejnych klasach bazowych (kolejno, idąc w górę hierarchii klas).