Virtuaalimetodi

Wikipediasta
(Ohjattu sivulta Virtuaaliosoitin)
Siirry navigaatioon Siirry hakuun

Virtuaalimetodi tai virtuaalifunktio (engl. virtual method, engl. virtual function) 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.[1] 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.[2]

Virtuaaliosoitin (engl. virtual pointer) on funktio-osoittimen tapaus, jolla virtuaalimetodeihin viitataan. Virtuaaliosoittimet sijoitetaan ajonaikaisesti virtuaalimetoditaulukkoon (engl. virtual method table, engl. virtual call table). 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ä.[3][4] Virtuaalimetoditaulukkoa on ensiksi käytetty Simula-kielessä. Taulukon perusajatus on hakea funktion osoite indeksoidusta taulukosta.[5]

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);
}
  • Stroustrup, Bjarne: The C++ Programming Language, 4th ed. Addison-Wesley, 2015. ISBN 0-321-56384-0
  1. Virtual methods freepascal.org. Viitattu 26.3.2018.
  2. Virtual functions (C++ only) ibm.com. Viitattu 22.1.2024. (englanniksi)
  3. Stroustrup, Bjarne: The C++ Programming Language, 4th ed. s. 65, 586-588, 597-598. Addison-Wesley, 2015. ISBN 0-321-56384-0 (englanniksi)
  4. Joydip Kanjilal: Exploring virtual and abstract methods in C# infoworld.com. 11.3.2015. Viitattu 22.1.2024. (englanniksi)
  5. Karel Driesen & Urs Hölzle: The direct cost of virtual function calls in C++ (PDF) dl.acm.org. lokakuu 1996. doi:10.1145/236337.236369 Viitattu 6.2.2024. (englanniksi)