Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

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");
    }
};

CElain-luokan toteuttava luokka CKissa:

Code Block
class CKissa : public CElain
{
public:
    void Aantele() {
        printf("Miau!\n");
    }
};
Code Block
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:

No Format
Miau!
Miau!

Jos CElain-luokan metodi Aantele() ei olisi virtuaalinen, tulostaisi ohjelma seuraavasti:

No Format
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.

Code Block
class CElain
{
private:
public:
    virtual ~CElain() { }
    virtual void Aantele() = 0;
};
Code Block
class CKissa : public CElain
{
public:
    void Aantele() {
        printf("Miau!\n");
    }
};