• Nie Znaleziono Wyników

Proste klasy pochodne

W dokumencie Język C++ – podstawy programowania (Stron 102-108)

Zajmiemy się teraz deklaracją klasy pochodnej, która dziedziczy cechy klasy podstawowej. Omówimy podstawowe zagadnienia związane z dziedzi-czeniem prostym (dziedziczenie pojedyncze). Niech klasa bazowa nazywa się Punkt a pochodna Kwadrat. Deklaracja klasy pochodnej ma następującą postać:

c l a s s Kwadrat : s p e c y f i k a t o r _ d o s t e p u Punkt {

5.4. Proste klasy pochodne 93

// . . . . } ;

Specyfikator dostępu oznacza rodzaj dziedziczenia: public, private lub pro-tected. Jeżeli mamy do czynienia z dziedziczeniem publicznym to piszemy:

c l a s s Kwadrat : public Punkt {

// . . . . } ;

Podamy przykład zastosowania klasy pochodnej. Niech klasa bazowa o na-zwie punkt ma dwie składowe prywatne x i y, które są współrzędnymi punk-tu na płaszczyźnie oraz funkcje składowe do obsługi tego punkpunk-tu. Należy utworzyć nową klasę pochodną punktB od klasy bazowej punkt. Klasa po-chodna punktB powinna zawierać nową funkcję, dzięki której będzie moż-na obliczyć odległość punktu od początku układu współrzędnych. Jeżeli współrzędne punktu wynoszą x i y to odległość punktu od początku układu współrzędnych wyraża się wzorem:

r = q

x2+ y2 (5.1)

Deklaracja klasy punkt zawarta w pliku ”punkt.h” ma postać:

Listing 5.1. Dziedziczenie publiczne - plik ”punkt.h”

// d e k l a r a c j a k l a s y p u n k t

Klasa punkt zawiera: dane prywatne x i y (są to współrzędne punktu), funkcję składową init(), funkcję składową pokaz() do wypisywania współ-rzędnych kartezjańskich punktu i dwie funkcje dostępu wsX() i wsY(). Na podstawie klasy bazowej punkt tworzymy klasę pochodną, która zawiera

94 5. Dziedziczenie i hierarchia klas dodatkową funkcję promien(). Na wydruku 5.2 pokazano klasę pochodną o nazwie punktB oraz funkcję testującą.

Listing 5.2. Dziedziczenie publiczne - klasa pochodna i funkcja testująca

1 // d z i e d z i c z e n i e p u b l i c z n e −−−

#include <i o s t r e a m . h>

3#include <c o n i o . h>

#include <math . h>

5#include " punkt . h"

7 c l a s s punktB : public punkt

Po uruchomieniu programu mamy następujący komunikat:

w s p o l r z e d n e : 3 4

promien : 5

Klasa pochodna punktB ma postać:

c l a s s punktB : public punkt

Zawiera ona funkcję składową promien (), która oblicza pierwiastek kwa-dratowy z sumy kwadratów współrzędnych punku. Jest to odległość punktu od początku układu współrzędnych.

W liniach:

punktB a ;

5.4. Proste klasy pochodne 95

Rysunek 5.10. Diagram klasy punkt i punktB w notacji UML. Klasa punktB dzie-dziczy składowe klasy punkt.

a . i n i t ( 3 , 4 ) ; a . pokaz ( ) ;

tworzony jest obiekt a klasy punktB, współrzędnym x i y nadawane są wartości 3 i 4 oraz wywoływana jest funkcja składowa klasy bazowej pokaz() do wyświetlania współrzędnych punktu (obiektu a). W linii:

c o u t << " promien ␣ ␣ ␣ ␣ ␣ : ␣ " << a . promien ( ) ;

wywoływana jest funkcja składowa klasy pochodnej do obliczania odległości punktu od początku układu współrzędnych. Klasa punktB nie ogranicza, jak widać dostępu do dziedziczonych składowych klasy punkt. Oznacza to, że odziedziczone publiczne funkcje składowe takie jak na przykład init() mogą być wywoływane także dla obiektów klasy punktB.

Klasy pochodne mogą być specyfikowane jako publiczne, prywatne i chronione. Każda taka specyfikacja rodzi określone konsekwencje:

— Jeżeli specyfikatorem jest public, to wszystkie składowe publiczne w kla-sie bazowej są także składowymi publicznymi w klakla-sie pochodnej. Klasa pochodna dziedziczy wszystkie składowe klasy bazowej.

— Jeżeli specyfikatorem jest private, to wszystkie składowe publiczne klasy bazowej są prywatnymi składowymi klasy pochodnej. Składowe prywat-ne klasy bazowej są niedostępprywat-ne dla klasy pochodprywat-nej.

— Jeżeli specyfikatorem jest protected to klasa pochodna ma dostęp do składowych chronionych.

Składowe klasy bazowej mogą być typu private, protected i public. Z kolei klasa bazowa może być także zadeklarowana dla klasy pochodnej jako

96 5. Dziedziczenie i hierarchia klas private, protected i public. Wymaga to omówienia. Rozpatrzmy następującą klasę bazową punkt:

— Klasa bazowa jest publiczna. Dostępne publiczne składowe klasy bazowej nadal dostępne są publicznie w klasie pochodnej. Składowe o dostępie chronionym i prywatnym w klasie bazowej, zachowują odpowiedni ro-dzaj dostępu w klasie pochodnej. W naszym przykładzie zmienna y jest składową chronioną w klasie pochodnej (jest składową prywatną, ale dostępną dla klas pochodnych)

— Klasa bazowa jest prywatna. W tym przypadku dostęp do wszystkich składowych dziedziczonych po klasie bazowej staje się prywatny. Składo-we te przestają być dostępne zarówno dla użytkownika klasy pochodnej, jak i dla jej klas pochodnych. W naszym przykładzie zmienne y i z stają się prywatnymi składowymi klasy pochodnej.

— Klasa bazowa jest chroniona. W takim przypadku wszystkie publiczne i chronione składowe klasy bazowej stają się chronionymi składowymi klasy pochodnej. W naszym przykładzie zmienne y i z staną się chronio-nymi składowymi klasy pochodnej.

Aby zilustrować powyższe rozważania utworzymy klasę bazową punkt, w której składowe x i y są chronione:

Listing 5.3. Dziedziczenie publiczne - plik ”punkt.h” - dane typu protected

1 // d e k l a r a c j a k l a s y p u n k t

5.4. Proste klasy pochodne 97

double wsX ( ) { return x ; }

15 double wsY ( ) { return y ; } } ;

Klasa pochodna punktB ma dostęp do zmiennych x i y i wtedy funkcja składowa promien() istotnie się upraszcza:

c l a s s punktB : public punkt

Funkcja testująca razem z klasą pochodną punktB ma postać:

Listing 5.4. Klasa pochodna i funkcja testująca - dane typu protected

// d z i e d z i c z e n i e p u b l i c z n e dane p r o t e c t e d −−−

2

#include <i o s t r e a m . h>

4#include <c o n i o . h>

#include <math . h>

6#include " punkt . h"

8 c l a s s punktB : public punkt

W tym przykładzie widzimy, że funkcja składowa promien() klasy po-chodnej punktB ma prostą postać:

double promien ( )

{ return s q r t ( x ∗ x + y ∗ y ) ; }

98 5. Dziedziczenie i hierarchia klas Ponieważ dane x i y są zadeklarowane jako protected, klasa pochodna ma bezpośredni dostęp do nich. W poprzednim przykładzie, dane x i y były zadeklarowane jako private, wobec czego funkcja składowa klasy pochodnej musiała mieć dość skomplikowaną postać.

Definicja tej funkcji (wydruk 5.2) miała postać:

double promien ( )

{ return s q r t ( wsX ( ) ∗ wsX ( ) + wsY ( ) ∗ wsY ( ) ) ; }

W dokumencie Język C++ – podstawy programowania (Stron 102-108)