Poznaj C++ w$ godziny0253

Poznaj C++ w$ godziny0253



Dziedziczenie 245

Dziedziczenie 245

destruktor Psa. .

destruktor Ssaka destruktor Ssaka


W linii 34 klasa Pies nadpisuje metodę Mow () tak, aby każdy obiekt

klasy Pies szczekał (wypisywał na ekranie Hau!) w momencie wywołania metody Mow(). W linii 42 jest tworzony obiekt klasy Ssak o nazwie duzeZwierze (pierwsza linia wydruku wyjściowego to efekt wywołania konstruktora klasy Ssak). W linii 43 tworzymy obiekt klasy Pies (dwie kolejne linie wydruku to efekt wywołania kolejno konstruktora klasy Ssak i konstruktora klasy Pies).

W linii 44 obiekt klasy Ssak wywołuje swoją metodę Mow(). Podobnie obiekt klasy Pies w linii 45. Linie wydruku świadczą o tym, że zostały wywołane właściwe, dla każdej klasy, metody. Na koniec, podczas usuwania obydwu stworzonych obiektów z pamięci, zostają wywołane destruktory klas.

Przeciążanie czy nadpisywanie

Obie metody dają podobne efekty. Kiedy przeciążasz metodę to tworzysz kilka różnych metod o tej samej nazwie i o różnej sygnaturze (wartość zwracana, lista parametrów). Kiedy nadpisujesz metodę to tworzysz w klasie pochodnej metodę, która zastępuje metodę z klasy bazowej.

Ukrywanie metod klasy bazowej

W ostatnim programie, metoda klasy Pies o nazwie Mow() ukryła metodę klasy bazowej. O to nam chodziło, ale istnieje możliwość zaistnienia pewnego efektu ubocznego. Jeśli klasa Ssak miałaby przeciążoną metodę Ruch (), którą byśmy nadpisali w klasie Pies, to zostałyby ukryte wszystkie przeciążone metody Ruch() w klasie Ssak.

Jeśli klasa Ssak miałaby trzy metody przeciążające funkcję Ruch() - jedną nie pobierająca parametrów, druga pobierającą wartość całkowitą i trzecią dwuargu-mentową i jeśli klasa Pies nadpisałaby metodę Ruch() funkcją nie pobierającą parametrów to dostęp do pozostałych dwóch metod z klasy Ssak byłby bardzo utrudniony. Listing 16.6 ilustruje ten problem.

Listing 16.6. Ukrywanie metod

2:

3:

4:

5:

6:

7:

8:

9:

10


1:    //Listing 16.6 Ukrywanie metod

#include <iostream.h>

class Ssak {

public:


void Ruch() const { cout « "Ssak przeszedł jeden krok\n"; ) void Ruch(int distance) const

{ cout « "Ssak przeszedł " « distance «" kroki. \n"; }

destruktor Psa... destruktor Ssaka... destruktor Ssaka...

ANALIZA


W linii 34 klasa Pies nadpisuje metodę Mow() tak, aby każdy obiekt I klasy Pies szczeka! (wypisywał na ekranie Hau!) w momencie wywołania metody Mow (). W linii 42 jest tworzony obiekt klasy Ssak o nazwie duzeZwierze (pierwsza linia wydruku wyjściowego to efekt wywołania konstruktora klasy Ssak). W linii 43 tworzymy obiekt klasy Pies (dwie kolejne linie wydruku to efekt wywołania kolejno konstruktora klasy Ssak i konstruktora klasy Pies).

W linii 44 obiekt klasy Ssak wywołuje swoją metodę Mow(). Podobnie obiekt klasy Pies w linii 45. Linie wydruku świadczą o tym, że zostały wywołane właściwe, dla każdej klasy, metody. Na koniec, podczas usuwania obydwu stworzonych obiektów z pamięci, zostają wywołane destruktory klas.

Przeciążanie czy nadpisywanie

Obie metody dają podobne efekty. Kiedy przeciążasz metodę to tworzysz kilka różnych metod o tej samej nazwie i o różnej sygnaturze (wartość zwracana, lista parametrów). Kiedy nadpisujesz metodę to tworzysz w klasie pochodnej metodę, która zastępuje metodę z klasy bazowej.

Ukrywanie metod klasy bazowej

W ostatnim programie, metoda klasy Pies o nazwie Mow () ukryła metodę klasy bazowej. O to nam chodziło, ale istnieje możliwość zaistnienia pewnego efektu ubocznego. Jeśli klasa Ssak miałaby przeciążoną metodę Ruch(), którą byśmy nadpisali w klasie Pies, to zostałyby ukryte wszystkie przeciążone metody Ruch() w klasie Ssak.

Jeśli klasa Ssak miałaby trzy metody przeciążające funkcję Ruch() - jedną nie pobierająca parametrów, druga pobierającą wartość całkowitą i trzecią dwuargu-mentową i jeśli klasa Pies nadpisałaby metodę Ruch() funkcją nie pobierającą parametrów to dostęp do pozostałych dwóch metod z klasy Ssak byłby bardzo utrudniony. Listing 16.6 ilustruje ten problem.

Listing 16.6. Ukrywanie metod

1:    //Listing 16.6 Ukrywanie metod

2:

3:    ttinclude    <ios tream. h>

4:

5:    class Ssak

6:    {

7:    public:

8:    void Ruch() const { cout « "Ssak przeszedł jeden krok\n"; )

9:    void Ruch(int distance) const

10:    ( cout « "Ssak przeszedł " « distance «" kroki. \n"; }


Wyszukiwarka

Podobne podstrony:
Poznaj C++ w$ godziny0238 Dziedziczenie i polimorfizmGodzina 16    Dziedziczenie 17 &
Poznaj C++ w$ godziny0241 Dziedziczenie 233 Dziedziczenie 233 Rysunek 16.1 Hierarchia zwierzątKróles
Poznaj C++ w$ godziny0243 Dziedziczenie 235 Ten program nie wypisuje nic na ekranie, gdyż jest jedyn
Poznaj C++ w$ godziny0245 Dziedziczenie 237 43:    void ProsOJedzenie() { cout « &quo
Poznaj C++ w$ godziny0247 Dziedziczenie 239 60: 61:    Pies::Pies () : 62:
Poznaj C++ w$ godziny0251 Dziedziczenie 243 Zauważ, że w linii 74, domyślny konstruktor klasy Pies w
Poznaj C++ w$ godziny0255 Dziedziczenie 247 Tak wygląda bezpośrednie wywołanie metody klasy Ssak. Li
Poznaj C++ w$ godziny0062 Instrukcje i wyrażenia 47Instrukcja if Normalnie program wykonuje się lini
Poznaj C++ w$ godziny0257 Godzina 17Polimorfizm i klasy pochodne W trakcie ostatniej godziny poznałe
skanuj0013 (239) - 18 - Przykładem może być dziedziczenie szorstkości włosa u psa* Szorstkość wywoła
Poznaj C++ w$ godziny0181 170 Godzina 12 wyrzucany z pamięci poprzez wywołanie destruktora. Widać to
Poznaj C++ w$ godziny0001 Gdy masz czas tylko na właściwe rozwiązania... Intersoftlcind Gdy masz cza
Poznaj C++ w$ godziny0002 Jesse LibertyC++w 2 4 godziny Tłumaczenie: Grzegorz MichałekInlersofllond
Poznaj C++ w$ godziny0003 Tytuł oryginału: Teach Yourself C++ in 24 Hours, Second Edition Tłumaczeni
Poznaj C++ w$ godziny0004 Spis rozdziałów Część 1 Wstęp do C++ 1 1 Zaczynamy 3 2 Program w C++ 1
Poznaj C++ w$ godziny0005 Część VI Tematy specjalne 293 20 Specjalne klasy i
Poznaj C++ w$ godziny0006 Spis treści Część I Wstęp do C++    1 1    Z
Poznaj C++ w$ godziny0007 VI Poznaj C++ w 24 godziny Przypisywanie wartości do zmiennych

więcej podobnych podstron