Funkcja wirtualna w C++ to metoda klasy bazowej oznaczona słowem kluczowym virtual. Umożliwia ona wywołanie odpowiedniej wersji metody zależnie od rzeczywistego typu obiektu, a nie tylko od typu wskaźnika lub referencji.
Mechanizm ten jest podstawą polimorfizmu dynamicznego. Programista może operować na obiekcie przez wskaźnik lub referencję do klasy bazowej, a C++ sam wybierze metodę z klasy pochodnej, jeśli została ona nadpisana.
Przykład
#include <iostream>
using namespace std;
class Figura {
public:
virtual void rysuj() {
cout << "Rysuję figurę" << endl;
}
};
class Kolo : public Figura {
public:
void rysuj() override {
cout << "Rysuję koło" << endl;
}
};
int main() {
Figura* f = new Kolo();
f->rysuj(); // Rysuję koło
delete f;
}
Bez virtual zostałaby wywołana metoda z klasy bazowej Figura, ponieważ wskaźnik ma typ Figura*.
Ważne cechy
- funkcje wirtualne działają głównie przy dziedziczeniu,
- pozwalają realizować polimorfizm,
- decyzja o wywołanej metodzie zapada w czasie działania programu,
- w klasach bazowych często stosuje się też
virtualprzy destruktorze.
Słowo override
Słowo override nie jest obowiązkowe, ale warto go używać. Informuje kompilator, że metoda ma nadpisywać metodę wirtualną z klasy bazowej. Jeśli programista popełni błąd w nazwie lub parametrach, kompilator zgłosi problem.