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 virtuaalsia funktioita
class CElain { public: virtual ~CElain() { } // Virtuaalinen hajoitin virtual void Aantele() { // Virtuaalinen Aantele()-metodi printf("Virtuaalinen Aantele()...\n"); } };
CElain-luokan toteuttava luokka CKissa:
class CKissa : public CElain { public: void Aantele() { printf("Miau!\n"); } };
int main() { CKissa kissa; kissa.Aantele(); CElain* elain = &kissa; elain->Aantele(); return 0; }
Yllä esiteltiin kantaluokan metodi Aantele() sekä hajoitin ~CElain() virtuaalisiksi.
Esimerkki tulostaa ruudulle:
Miau! Miau!
Jos CElain-luokan metodi Aantele() ei olisi virtuaalinen, tulostaisi ohjelma seuraavasti:
Miau! Virtuaalinen Aantele()...
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.
class CElain { private: public: virtual ~CElain() { } virtual void Aantele() = 0; };
class CKissa : public CElain { public: void Aantele() { printf("Miau!\n"); } };