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