Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3
Wiki Markup
h1. Virtuaalifunktiot

Virtuaalifunktioiden avulla voidaan muuttaa kantaluokasta perittyä toiminnallisuutta. Tämä tapahtuu riippumatta siitä, käsitelläänkö oliota perillisen vai kantaluokan osoittimen kautta, kts [polymorfismi]. Virtuaalifunktiot mahdollistavat perillisen ylikirjoittamien metodien käytön, kun olio on tehty perillisestä ja sitä käsitellään kantaluokan osoittimen kautta.

[Hajoitin|Hajoittimet] on hyvä kirjoittaa virtuaaliseksi aina kun luokassa on yksikin virtuaalinen metodi.

h3. Esimerkki 1. Virtuaalifunktion esittely.

Kantaluokka CElain, jossa on virtuaalisia funktioita
{code}
class CElain
{
public:
    virtual ~CElain() { }                      // Virtuaalinen hajoitin
    virtual void Aantele() {                   // Virtuaalinen Aantele()-metodi
        printf("Virtuaalinen Aantele()...\n");
    }
};
{code}
CElain\-luokan toteuttava luokka CKissa:
{code}
class CKissa : public CElain
{
public:
    void Aantele() {
        printf("Miau!\n");
    }
};
{code}
{code}
int main()
{
    CKissa kissa;
    kissa.Aantele();
    CElain* elain = &kissa;
    elain->Aantele();

    return 0;
} 
{code}
Yllä esiteltiin kantaluokan metodi _Aantele()_ sekä hajoitin _~CElain()_ virtuaalisiksi.

Esimerkki tulostaa ruudulle:
{noformat}
Miau!
Miau!
{noformat}

Jos CElain-luokan metodi _Aantele()_ ei olisi virtuaalinen, tulostaisi ohjelma seuraavasti:
{noformat}
Miau!
Virtuaalinen Aantele()...
{noformat}

Näin tapahtuu, koska toinen _Aantele()_\-metodin kutsu käyttää CElain-tyyppistä osoitinta ja ei-virtuaalisten metodien mahdollista ylikirjoitusta ei tarkisteta. Eli kutsut CElain-luokan olion kautta kutsuu vain CElain-luokassa toteutettuja metodeita.

h2. Aidot virtuaalifunktiot

Luokasta, jossa on aito virtuaalifunktio ei voi luoda oliota. Mutta sitä voidaan käyttää osoittimena perillisen käsittelyyn, kts abstraktit luokat. Funktio määritellään aidoksi virtuaalifunktioksi laittamalla = 0 funktion esittelyn perään, ennen puolipistettä.

h3. Esimerkki 2. Aidon virtuaalifunktion esittely.

{code}
class CElain
{
private:
public:
    virtual ~CElain() { }
    virtual void Aantele() = 0;
};
{code}
{code}
class CKissa : public CElain
{
public:
    void Aantele() {
        printf("Miau!\n");
    }
};
{code}