246 Godzina 16
11: protected:
12: int jegoWiek;
13: int jegoWaga;
14: ) ;
15:
16: class Pies : public Ssak
17: {
18: public:
19: void Ruch() const { cout « "Pies przeszedł 5 krokow.\n"; }
20: }; // Możesz otrzymać ostrzeżenie o ukrywaniu metody
21:
22: int main()
23: {
24: Ssak duzeZwierze;
25: Pies fido;
26: duzeZwierze.Ruch();
27: duzeZwierze.Ruch(2);
28: fido.Ruch();
29: // fido.Ruch(10);
30: return 0;
31: }
Ssak przeszedł jeden krok Ssak przeszedł 2 kroki. Pies przeszedł 5 kroków.
ANALIZA
Z programu usunęliśmy wszystkie, chwilowo niepotrzebne metody. W liniach 8 i 9 znajdują się deklaracje przeciążonych metod Ruch (). W linii 18, klasa Pies nadpisuje bezargumentową metodę Ruch(). W liniach 26—28 wywoływane są odpowiednie metody Ruch (). Wydruk wyjściowy stanowi informację o tym, co zostało wywołane.
Linia 29 została zakomentowana ponieważ powoduje błąd kompilacji. Jeśli klasą Pies nie nadpisałyby metody Ruch() to mogłaby wywołać metodę Ruch (int). Teraz, jeśli chcielibyśmy wykorzystać metodę z parametrem, musielibyśmy również ją nadpisać. Zwróć uwagę na analogię z konstruktorami. Jeżeli stworzysz jakikolwiek konstruktor to kompilator nie będzie już zapewniał konstruktora domyślnego.
Bardzo częstym błędem jest nieświadome ukrycie metod klasy bazowej przy próbie nadpisania ich. Przyczyną jest pominięcie słowa kluczowego const. const jest częścią sygnatury funkcji i pominięcie go zmienia sygnaturę powodując ukrycie funkcji zamiast jej nadpisania.
Jeśli nadpisałeś metodę bazową to nadal istnieje możliwość wywołania nadpisanej funkcji. Należy w tym celu podać pełną nazwę metody łącznie z nazwą klasy bazowej. Oto przykład:
Ssak: :Ruch()
Możliwa jest również pewna ciekawa modyfikacja linii 29 ostatniego programu:
29: fido.Ssak::Ruch(10);
11: protected:
12: int jegoWiek;
13: int jegoWaga;
14: ) ;
15:
16: class Pies : public Ssak
17: {
18: public:
19: void Ruch() const ( cout « "Pies przeszedł 5 krokow.\n"; )
20: ); II Możesz otrzymać ostrzeżenie o ukrywaniu metody
21:
22: int ntain()
23: (
24: Ssak duzeZwierze;
25: Pies fido;
26: duzeZwierze.Ruch();
27: duzeZwierze.Ruch(2);
28: fido.Ruch();
29: // fido.Ruch(lO);
30: return 0;
31: )
Ssak przeszedł jeden krok Ssak przeszedł 2 kroki. Pies przeszedł 5 kroków.
ANALIZA
I Z programu usunęliśmy wszystkie, chwilowo niepotrzebne metody. ® W liniach 8 i 9 znajdują się deklaracje przeciążonych metod Ruch(). W linii 18, klasa Pies nadpisuje bezargumentową metodę Ruch (). W liniach 26-28 wywoływane są odpowiednie metody Ruch (). Wydruk wyjściowy stanowi informację o tym, co zostało wywołane.
Linia 29 została zakomentowana ponieważ powoduje błąd kompilacji. Jeśli klasa Pies nie nadpisałyby metody Ruch() to mogłaby wywołać metodę Ruch (int). Teraz, jeśli chcielibyśmy wykorzystać metodę z parametrem, musielibyśmy również ją nadpisać. Zwróć uwagę na analogię z konstruktorami. Jeżeli stworzysz jakikolwiek konstruktor to kompilator nie będzie już zapewniał konstruktora domyślnego.
Bardzo częstym błędem jest nieświadome ukrycie metod klasy bazowej przy próbie nadpisania ich. Przyczyną jest pominięcie słowa kluczowego const. const jest częścią sygnatury funkcji i pominięcie go zmienia sygnaturę powodując ukrycie funkcji zamiast jej nadpisania.
Jeśli nadpisałeś metodę bazową to nadal istnieje możliwość wywołania nadpisanej funkcji. Należy w tym celu podać pełną nazwę metody łącznie z nazwą klasy bazowej. Oto przykład:
Ssak: -.Ruch ()
Możliwa jest również pewna ciekawa modyfikacja linii 29 ostatniego programu:
29: fido.Ssak::Ruch(10);