Dziedziczenie 243
Zauważ, że w linii 74, domyślny konstruktor klasy Pies wywołuje domyślny konstruktor klasy Ssak. Takie rozwiązanie nie jest ściśle wymagane, jest to „dokumentacja” wywołania domyślnego konstruktora klasy bazowej. Bazowy konstruktor i tak zostanie wywołany.
W liniach 80-85 zawarta jest implementacja jednoparametrowego konstruktora klasy Pies. W części inicjalizującej Ginie 81-82) Pies inicjalizuje swoją klasę bazową, przekazując parametr i inicjalizuje zmienną mówiącą o rasie psa.
W liniach 87-93 znajduje się implementacja kolejnego, dwuargumentowego konstruktora. Podobnie jak poprzednie, najpierw inicjalizuje on klasę bazową poprzez wywołanie odpowiedniego konstruktora klasy Ssak. Dodatkowo inicjalizowana jest zmienna wewnętrzna jegoWaga. Zauważ, że nie ma możliwości inicjalizacji zmiennej klasy bazowej w części inicjalizacyjnej konstruktora. Ponieważ klasa Ssak nie posiada konstruktora pobierającego wartość dla zmiennej jegoWaga, dlatego inicja-lizację trzeba przeprowadzić w treści konstruktora.
Przeanalizuj implementację pozostałych konstruktorów i upewnij się, czy wszystko jest dla Ciebie zrozumiałe. Zwróć uwagę na to, co jest inicjalizowane w części inicjalizującej, a co w treści konstruktora.
Linie wydruku wyjściowego zostały ponumerowane. Ułatwi to analizę programu. Pierwsze dwie linie są efektem tworzenia obiektu Fido z wykorzystaniem konstruktora domyślnego.
Linie 3 i 4 ilustrują tworzenia Rover-a. Linie 5 i 6 należą do Buster-a. Zauważ, że wywołany konstruktor klasy Ssak pobiera jedną wartość, a wywołany konstruktor klasy Pies dwie wartości.
Po stworzeniu obiektów i wykonaniu na nich prostych operacji następuje usunięcie ich z pamięci. Zawsze jako pierwszy jest wywoływany destruktor klasy Pies, a następnie destruktor klasy Ssak.
Obiekt klasy Pies ma dostęp do wszystkich funkcji wewnętrznych klasy Ssak tak jak do własnych. Podobnie, jak dodaliśmy metodę MachajOgonem(), możemy dodać inne funkcje. Istnieje również możliwość nadpisania funkcji klasy bazowej. Napisanie oznacza zmianę implementacji funkcji z klasy bazowej. Kiedy wywołujesz metodę z klasy pochodnej kompilator wywoła tę właściwą - stworzoną w tej klasie.
NOWY TERMIN
Kiedy klasa pochodna tworzy funkcję z tym samym typem wartości zwracanej, z tą samą nazwą i listą parametrów (sygnaturą) co jakaś funkcja w klasie bazowej i definiuje jej nową implementację to mówimy o nadpisaniu tej funkcji (metody).
Kiedy chcesz napisać funkcję, musisz zapewnić zgodność typu wartości zwracanej, nazwy i listy parametrów z funkcją klasy bazowej.
Zauważ, że w linii 74, domyślny konstruktor klasy Pies wywołuje domyślny konstruktor klasy Ssak. Takie rozwiązanie nie jest ściśle wymagane, jest to „dokumentacja” wywołania domyślnego konstruktora klasy bazowej. Bazowy konstruktor i tak zostanie wywołany.
W liniach 80-85 zawarta jest implementacja jednoparametrowego konstruktora klasy Pies. W części inicjalizującej (linie 81-82) Pies inicjalizuje swoją klasę bazową, przekazując parametr i inicjalizuje zmienną mówiącą o rasie psa.
W liniach 87-93 znajduje się implementacja kolejnego, dwuargumentowego konstruktora. Podobnie jak poprzednie, najpierw inicjalizuje on klasę bazową poprzez wywołanie odpowiedniego konstruktora klasy Ssak. Dodatkowo inicjalizowana jest zmienna wewnętrzna jegoWaga. Zauważ, że nie ma możliwości inicjalizacji zmiennej klasy bazowej w części inicjalizacyjnej konstruktora. Ponieważ klasa Ssak nie posiada konstruktora pobierającego wartość dla zmiennej jegoWaga. dlatego inicja-lizację trzeba przeprowadzić w treści konstruktora.
Przeanalizuj implementację pozostałych konstruktorów i upewnij się, czy wszystko jest dla Ciebie zrozumiałe. Zwróć uwagę na to, co jest inicjalizowane w części inicjalizującej, a co w treści konstruktora.
Linie wydruku wyjściowego zostały ponumerowane. Ułatwi to analizę programu. Pierwsze dwie linie są efektem tworzenia obiektu Fido z wykorzystaniem konstruktora domyślnego.
Linie 3 i 4 ilustrują tworzenia Rover-a. Linie 5 i 6 należą do Buster-a. Zauważ, że wywołany konstruktor klasy Ssak pobiera jedną wartość, a wywołany konstruktor klasy Pies dwie wartości.
Po stworzeniu obiektów i wykonaniu na nich prostych operacji następuje usunięcie ich z pamięci. Zawsze jako pierwszy jest wywoływany destruktor klasy Pies, a następnie destruktor klasy Ssak.
Obiekt klasy Pies ma dostęp do wszystkich funkcji wewnętrznych klasy Ssak tak jak do własnych. Podobnie, jak dodaliśmy metodę MachajOgonem (), możemy dodać inne funkcje. Istnieje również możliwość nadpisania funkcji klasy bazowej. Napisanie oznacza zmianę implementacji funkcji z klasy bazowej. Kiedy wywołujesz metodę z klasy pochodnej kompilator wywoła tę właściwą - stworzoną w tej klasie.
NOWY TERMIN
Kiedy klasa pochodna tworzy funkcję z tym samym typem wartości zwracanej, z tą samą nazwą i listą parametrów (sygnaturą) co jakaś funkcja w klasie bazowej i definiuje jej nową implementację to mówimy o nadpisaniu tej funkcji (metody).
Kiedy chcesz napisać funkcję, musisz zapewnić zgodność typu wartości zwracanej, nazwy i listy parametrów z funkcją klasy bazowej.
Listing 16.5. ilustruje, co się stanie, gdy klasa Pies nadpisze metodę Mow() klasy
Ssak. Dla skrócenia programu pominęliśmy funkcje dostępu.