Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0
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}

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 on hyvä kirjoittaa virtuaaliseksi aina kun luokassa on yksikin virtuaalinen metodi.

Esimerkki 1. Virtuaalifunktion esittely.

Kantaluokka CElain, jossa on virtuaalisia funktioita

Code Block
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}