jezyki_i_techniki_programowania:funkcje_wirtualne [mgr Wiki]

[[jezyki_i_techniki_programowania:funkcje_wirtualne]]
mgr Wiki

# Funkcje wirtualne ( C++ )

Niech dane będą klasy:

       class zwierze {
          public:
    	     void virtual wydaj_odglos(){
    	            cout << „Nieokreslony dzwiek”;
                       }
        }

         class kot : public zwierze{
         public:
    	     void wydaj_odglos(){
    		    cout << „Miauuu”;
                       }
        }

oraz wskaźnik:

        zwierze *wskZwierz;

ustawienie wskaźnika tak by wskazywał na obiekt klasy kot:

        kot maly_kotek;
         wskZwierz = & maly_kotek;

wywołanie funkcji:

        wskZwierz->wydaj_odglos();

Możliwe scenariusze:

- Kompilator widząc wskaźnik do obiektu klasy zwierze wywołuje jego funkcję składową.
- Przed wywołaniem metody na rzecz obiektu wskazywanego przez wskaźnik sprawdzany jest najpierw typ.

Dzięki słowu virtual w deklaracji funkcji w klasie bazowej, użyta zostanie funkcja z klasy pochodnej.

Posługując się funkcjami wirtualnymi mamy do czynienia z tzw. wiązaniem (powiązaniem wywołania funkcji z adresem) na etapie wykonania (późnym wiązaniem).

# Uwagi

To samo zachowanie dotyczy również referencji.

Dlaczego wszystkie funkcje nie są wirtualne ?

- Jeśli w klasie jest funkcja wirtualna, to obiekty są większe
- Decyzja o wywołaniu konkretnej funkcji podejmowana jest wolniej

Funkcja wirtualna

- nie może być funkcją typu static
- może być zadeklarowana jako funkcja zaprzyjaźniona z klasą

Jeśli klasa deklaruje funkcję wirtualną wówczas jej destruktor także powinien być wirtualny (nie dotyczy konstruktora).

# Wczesne wiązanie funkcji wirtualnych

- wywołanie na rzecz obiektu znanego z nazwy (kompilator wie do jakiej klasy należy)
- `wskaznik→klasa::funkcja();`
- wywołanie funkcji wirtualnej z konstruktora (destruktora) klasy podstawowej

# Wirtualność, a przeładowanie

Funkcje wirtualne

- ta sama nazwa
- te same argumenty
- inny zakres ważności

Funkcje przeładowane

- ta sama nazwa
- ten sam zakres ważności (zasięg)
- różne listy argumentów

# Klasy abstrakcyjne

Klasa abstrakcyjna to klasa, która nie reprezentuje żadnego konkretnego obiektu. Istnieją po to by z nich dziedziczyć – tworzyć klasy pochodne.

W C++ klasą abstrakcyjną jest klasa, która posiada zadeklarowaną co najmniej jedną metodę czysto wirtualną. Każda klasa która dziedziczy po klasie abstrakcyjnej i sama nie chce być abstrakcyjną, musi posiadać implementację każdej z odziedziczonych metod czysto wirtualnych.

        void virtual funkcja() = 0;

Zdefiniowanie funkcji wirtualnej w klasie abstrakcyjnej jako funkcji czysto wirtualnej oznacza również, że obiekty tej klasy nie mogą być tworzone.

# Linki

- http://sun.iinf.polsl.gliwice.pl/~rstaros/S/Pk34/pk3-7-metody%20wirtualne.ppt *

jezyki_i_techniki_programowania/funkcje_wirtualne.txt · Last modified: 2006/05/21 15:10 by 83.18.177.219