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