Virtuaalimetodi

Virtuaalimetodi tai virtuaalifunktio (, ) on olio-ohjelmointikielien ominaisuus, jolla perintää käyttävä olio voi korvata yliluokassa olevan metodin toteutuksen toisella. Virtuaalimetodeja tukevia kieliä ovat esimerkiksi C++ ja Object Pascal. Oletuksena ohjelmointikielen kääntäjä käyttää varhaista sidontaa käännösaikana, mutta kääntäjälle voi myös kertoa käyttämään myöhäistä sidontaa ajonaikana määrittämällä se virtuaaliseksi.

Virtuaaliosoitin () on funktio-osoittimen tapaus, jolla virtuaalimetodeihin viitataan.
Virtuaaliosoittimet sijoitetaan ajonaikaisesti virtuaalimetoditaulukkoon (, ).
Mikäli perityssä luokassa ei ole toteutusta virtuaalimetodille kutsut tehdään kantaluokan toteutukseen virtuaalimetoditaulukon kautta.
Abstrakti pure virtual metodi, jolla ei ole toteutusta kantaluokassa on pakko toteuttaa perityssä luokassa. Luokka, jolla on pure virtual -metodi on abstrakti luokka. Ylikirjoittavasta metodista tulee automaattisesti virtuaalinen: sen voi myös määrittää ylikirjoittavaksi override-määrityksellä. Virtuaalimetoditaulukkoa on ensiksi käytetty Simula-kielessä. Taulukon perusajatus on hakea funktion osoite indeksoidusta taulukosta. 

 Esimerkit 
Esimerkki C++-kielellä:
class Geometria
{
    virtual float pinta_ala() = 0; // pure virtual
    virtual int verteksilukum() { return 0; } // oletustoteutus
};

class Kolmio : public Geometria
{
    virtual float pinta_ala(); // määrittely
};

float Kolmio::pinta_ala() // toteutus
{
     return 42.0;
}

// kutsut virtuaalikutsujen kautta
Geometria *p = new Kolmio(); // käytetään kantaluokan osoitinta, ei tarvitse tietää varsinaista tyyppiä
float a = p->pinta_ala(); // perityn luokan toteutus
int l = p->verteksilukum();  // kantaluokan toteutus

C#-kielessä metodi määritellään virtuaaliseksi virtual-määrityksellä ja ylikirjoitetaan override-määrityksellä:
public virtual int alue() {
    return 0;
}
...
public override int alue () {
    return (leveys * korkeus);
}

 Katso myös 
 Osoitin (ohjelmointi)

 Lähteet 

Viitteet

Luokka:Olio-ohjelmointi