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