Virtuální funkce

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Virtuální funkce (někdy nazývané virtuální metoda) je funkce pracující s instancí třídy, jejíž chování je určeno definicí funkce třídy instance nezávisle na typu ukazatele, který na instanci ukazuje. Virtuální funkce tvoří základ pro polymorfismus, což je jeden ze základních znaků objektově orientovaného programování. V některých programovacích jazycích (například v Javě) jsou metody tříd vždy virtuální.

Popis[editovat | editovat zdroj]

Koncept virtuální funkce řeší následující problém: Mějme třídu B odvozenou od třídy A. Máme-li ukazatel na instanci třídy A, může ukazovat jak na instanci třídy A, tak i na instanci třídy B. Ve chvíli překladu programu ale nemusí být jasné, na instanci které třídy ukazatel ukazuje. Pokud není funkce virtuální, vykoná se funkce třídy A i v tom případě, kdy bude ukazatel ukazovat na instanci třídy B. Virtuální funkce řeší tento problém tím, že se nejprve podívá na typ objektu, a až poté vybere funkci ke spuštění. Toto vede k mírnému snížení výkonu aplikace, není proto použito vždy.

Příklad[editovat | editovat zdroj]

# include <iostream>
using namespace std;
 
class Utvar
{
   public:
   virtual void Kresli() { cout << "Kresli utvar..." << endl; }
};
 
class Kruh : public Utvar
{
   public:
   void Kresli() { cout << "Kresli kruh..." << endl; }
};
 
class Jehlan : public Utvar
{
   public:
   void Kresli() { cout << "Kresli jehlan..." << endl; }
};
 
int main()
{
  Utvar* uUtvar = new Utvar();
  Utvar* uKruh = new Kruh();
  Utvar* uJehlan = new Jehlan();
 
  uUtvar->Kresli();
  uKruh->Kresli();
  uJehlan->Kresli();
 
  delete uUtvar;
  delete uKruh;
  delete uJehlan;
 
  return 0;
}

Výstup s virtuální metodou Kresli:

Kresli utvar...
Kresli kruh...
Kresli jehlan...

Výstup kdyby metoda Kresli nebyla deklarována jako virtuální:

Kresli utvar...
Kresli utvar...
Kresli utvar...