Klasy Dziedziczenie
Transkrypt
Klasy Dziedziczenie
Klasy Dziedziczenie Istota dziedziczenia Dziedziczenie to technika pozwalająca na definiowanie nowej klasy na bazie już istniejącej class punkt {public: double x,y; punkt(double x,double y); void wypisz(); void przesun(double dx,double dy); }; class kolo:public punkt { public: double r; void wypisz(); double pole() { return 3.14*r*r; } }; Lista pochodzenia Dodatkowa składowa Nadpisana wersja Klasy dziedziczenie • Klasa koło jest klasą pochodną klasy punkt • Klasa punkt jest klasą podstawową • W klasie pochodnej możemy Zdefiniować dodatkowe dane składowe Zdefiniować dodatkowe funkcje składowe Zdefiniować składnik, który istnieje już w klasie podstawowej Zakres widoczności Jeżeli w klasie bazowej i pochodnej są składniki o tej samej nazwie wówczas w zakresie klasy pochodnej z tej klasy zasłania odziedziczony składnik z klasy podstawowej kolo obiekt; // definicja obiektu obiekt.wypisz(); Obiekt.punkt::wypisz();// wywołanie wypisz() z klasy podstawowej punkt Dziedziczenie dotyczy klas a nie jakiś konkretnych egzemplarzy czy obiektów Nieprywatne składniki klasy podstawowej • Składniki protected i public są dostępne w zakresie klasy pochodnej bezpośrednio • protected- dla całego świata ma być on dostępny tak, jakby był private czyli niedostępny. Dla klas pochodnych będzie on dostępny tak jak public • Składnik private jest zawsze prywatny czyli niedostępny Konstruując klasę decydujemy: Które składniki zamierza udostępnić szerokiej publiczności Które zastrzega tylko dla swoich klas pochodnych Które zachowuje tylko na prywatny użytek Klasa i słowo kluczowe using Class przodek {protected: int n; double x; void funprot(double*, int &); public: Int szer; double*funpubl(int m); } Class potomek:private przodek {/… protected: using przodek::x; using przodek::funprot; public: using przodek::szer; using przodek::funpubl; } Dzięki deklaracją dostępu mimo, że klasa przodek została odziedziczona prywatnie wybrane nazwy mogą być udostępnione tak, jakby dla nich odbyło się dziedziczenie typu public Czy konstruktor jest dziedziczony? Konstruktor w klasie bazowej punkt::punkt(double x,double y) {this->x=x; this->y=y; Konstruktor w klasie pochodnej kolo::kolo(double x,double y,double r):punkt(x,y) { //tu nie trzeba ustalać wartości x i y //bo były w konstruktorze punkt this->r=r; } } Zadanie do wykonania • Napisać program w którym korzysta się z klasy punkt i koło • Klasy koło i punkt powinny zawierać składniki takie jak w przykładzie omawianym na zajęciach • Dopisać do klas destruktor • W programie przetestować wszystkie składniki klas