====== 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  * 
