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

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");
    }
};
  • No labels
You must log in to comment.