250 Godzina 17
To jest właśnie główna zaleta polimorfizmu C++. Możesz np. stworzyć różne typy okienek - okna dialogowe, paski, okna edycyjne, listy i dać każdemu wirtualną metodę Rysuje;. Następnie poprzez stworzenie wskaźnika do okna i przypisaniu do pól dialogowych i innych typów pochodnych, możesz wywołać metodę Rysuj () bez zastanawiania się, jaki jest typ aktualnie obsługiwanego okna. Właściwa metoda zostanie wywołana bez Twojej ingerencji.
Otrzymany wskaźnik możesz wykorzystać do wywoływania dowolnej metody klasy Ssak. Jedyne co potrzebujesz to możliwość wywoływania odpowiednich metod nadpisanych w klasie Pies. Pozwalają na to metody wirtualne. Ilustruje to listing 17.1. Zwróć uwagę co się dzieje z metodami, które nie są wirtualne.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10
11
12
13
14
15
16
17
18
19
20 21 22
23
24
25
26
27
28
29
30
31
32
33
34
35
//Listing 17.1 Wykorzystanie metod wirtualnych
finclude <iostream.h>
class Ssak
1
public:
Ssak():jegoWiek(1) { cout « "Konstruktor Ssaka...\n"; ) ~Ssak() { cout « "Destruktor Ssaka...\n"; } void Ruch() const { cout « "Ssak przeszedł jeden krok\n"; ) virtual void Mow() const { cout « "Odgłos Ssaka!\n"; } protected:
int jegoWiek;
class Pies : public Ssak
public:
Pies() { cout « "Konstruktor Psa...\n"; )
~PiesO { cout « "Destruktor Psa...\n"; }
void WagTail() { cout « "Machanie ogonem...\n"; }
void Mow()const { cout « "Hau!\n"; }
void Ruch()const { cout « "Pies przeszedł 5 krokow...\n"; )
int main()
Ssak *pPies = new Pies; pPies->Ruch(); pPies->Mow() ;
return 0;
Otrzymany wskaźnik możesz wykorzystać do wywoływania dowolnej metody klasy Ssak. Jedyne co potrzebujesz to możliwość wywoływania odpowiednich metod nadpisanych w klasie Pies. Pozwalają na to metody wirtualne. Ilustruje to listing 17.1. Zwróć uwagę co się dzieje z metodami, które nie są wirtualne.
1:
2:
3:
4:
5:
6:
7:
6:
9:
10
11
12
13
14
15
16
17
18
19
20 21 22
23
24
25
26
27
28
29
30
31
32
33
34
35
To jest właśnie główna zaleta polimorfizmu C++. Możesz np. stworzyć różne typy okienek - okna dialogowe, paski, okna edycyjne, listy i dać każdemu wirtualną metodę Rysuj <). Następnie poprzez stworzenie wskaźnika do okna i przypisaniu do pól dialogowych i innych typów pochodnych, możesz wywołać metodę Rysuj () bez zastanawiania się, jaki jest typ aktualnie obsługiwanego okna. Właściwa metoda zostanie wywołana bez Twojej ingerencji.
//Listing 17.1 Wykorzystanie metod wirtualnych
łinclude <iostream.h>
class Ssak
public:
Ssak():jegoWiek(1) { cout « "Konstruktor Ssaka...\n"; ) ~Ssak() { cout « "Destruktor Ssaka...\n"; }
void Ruch() const ( cout « "Ssak przeszedł jeden krok\n"; } virtual void Mow() const { cout « "Odgłos Ssaka!\n"; ) protected:
int jegoWiek;
class Pies : public Ssak
{
public;
Pies () ( cout « "Konstruktor Psa...\n"; }
-Pies() { cout « "Destruktor Psa...\n"; )
void WagTail() { cout « "Machanie ogonem...\n"; }
void Mow()const { cout « "Hau!\n"; }
void Ruch()const ( cout « "Pies przeszedł 5 krokow...\n"; )
} ;
int main()
<
Ssak *pPies = new Pies; pPies->Ruch() ; pPies->Mow() ;
return 0;