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