C++/Funkcje wirtualne: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
+info o metodach abstrakcyjnych |
+info o override |
||
Linia 168:
==
Niekiedy tworząc klasy nie wiadomo, jak jedną lub więcej metod zrealizować. Np. są to metody mające zapisywać wyniki - a one mogą być zapisywane do pliku, na konsolę, wysyłane przez sieć, być może użytkownik będzie chciał dostać dodatkowe podsumowanie itp. Czyli dana metoda musi się wykonać, ale z punktu widzenia projektu klasy nie chcemy bądź nie możemy wnikać w szczegóły jej działania.
Linia 177:
<source lang="cpp" highlight="3">
class
virtual int wyswietl() = 0;
Linia 183:
</source>
==Nadpisywanie metod wirtualnych - override (C++11)==
Dodanie do klasy pochodnej metody wirtualnej o tej samej nazwie co metoda w klasie bazowej, ale innym zestawie argumentów jest jak najbardziej możliwe --- mamy wówczas do czynienia z przeciążeniem nazw funkcji i to od parametrów wywołania zależy, która metoda zostanie uruchomiona.
Jednak dodawanie metody o tej samej nazwie ma w 99% przypadków jeden cel --- '''nadpisanie metody''' w klasie pochodnej. Problemem jest gdy lista parametrów się nie zgadza (na skutek pomyłki, zmian w klasie bazowej, itp.), wtedy '''wbrew intencjom''' wprowadzona jest nowa metoda. Aby zapobiec takim problemom od wersji C++11 dostępny jest nowy kwalifikator metod '''override''', który jasno mówi kompilatorowi, że metodę o podanej nazwie chcemy nadpisać. Jeśli metody o tej nazwie nie ma w klasie bazowej, bądź posiada inną sygnaturę, wówczas zgłaszany jest błąd kompilacji.
<source lang="cpp" highlight="6">
class Bazowa {
virtual void wyswietl(int);
};
class Pochodna: public bazowa {
virtual void wyswietl(int) override;
// błąd: różne sygnatury
// virtual void wyswietl(double) override
// błąd: brak metody
// virtual void drukuj() override
};
</source>
<noinclude>
|