C++/Funkcje wirtualne: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
+info o metodach abstrakcyjnych
+info o override
Linia 168:
 
 
==FunkcjeMetody i klasy abstrakcyjne==
 
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 KlasaAbstracyjnaKlasaAbstrakcyjna {
 
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>