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 |
---|
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 Block |
---|
} class CKissa : public CElain { public: void Aantele() { printf("Miau!\n"); } }; {code} {code} |
Code Block |
---|
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:
No Format |
---|
} Miau! Miau! {noformat} |
Jos
...
CElain-luokan
...
metodi
...
Aantele()
...
ei
...
olisi
...
virtuaalinen,
...
tulostaisi
...
ohjelma
...
seuraavasti:
No Format |
---|
} 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.
...
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ä.
...
Esimerkki
...
2.
...
Aidon
...
virtuaalifunktion
...
esittely.
Code Block |
---|
}
class CElain
{
private:
public:
virtual ~CElain() { }
virtual void Aantele() = 0;
};
|
Code Block |
---|
{code} {code} class CKissa : public CElain { public: void Aantele() { printf("Miau!\n"); } }; {code} |