You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 7 Next »

Moniperiytyminen

Tyypillisesti luokka periytyy suoraan ainoastaan yhdestä luokasta, mutta joskus luokka kannattaa periyttää useista luokista. Kyseessä on silloin moniperiytyminen.

Esimerkiksi, jos ajattelemme pegasusta, lentävää hevosta, joka omaa ominaisuuksia hevosesta ja linnusta. Helpoin tapa toteuttaa edellä kuvattu luokka on periyttää sen ominaisuudet kahdesta luokasta: hevonen ja lintu.

Esimerkki 1. Moniperiytyminen.

class CHevonen
{
public:
    void Aantele() {
        printf("Iii-haa-haa!\n");
    }
};

class CLintu
{
public:
    void Lenna() {
        printf("Lintu lentää\n");
    }
};

class CPegasus :
    public CHevonen,
    public CLintu
{
};

int main()
{
    CPegasus pegasus;

    pegasus.Aantele();
    pegasus.Lenna();
}

Nyt lentävä hevonen perii sekä hevosen että linnun piirteet. Yksi ongelma moniperiytymisessä tulee vastaan, jos molemmilla perittävillä luokilla on samanniminen metodi. Esimerkiksi Syo()-funktio.


Kuva 1. Esimerkin 1 UML-luokkakaavio.
 

Esimerkki 2. Moniperiytymisen ongelma.

class CHevonen
{
public:
    void Syo() {
    }
};

class CLintu
{
public:
    void Syo() {
    }
};

class CPegasus :
    public CHevonen,
    public CLintu
{
};

int main()
{
    CPegasus pegasus;

    pegasus.Syo();
}

Yllä olevassa esimerkissä C++-kääntäjä ei tiedä kumpaa Syo()-funktiota tarkoitetaan ja se antaa virheilmoituksen.


Kuva 2. Esimerkin 2 UML-luokkakaavio.

Ongelma voidaan kiertää määrittelemällä kumpaa Syo()-funktioista halutaan käyttää:

int main()
{
    CPegasus pegasus;

    pegasus.CLintu::Syo();
}

Moniperintä ohjelmointikielissä

Kaikki olio-ohjelmointikielet eivät tue moniperintää, kuten esim Java. Moniperintä on kuitenkin tuettu C++-kielessä.

  • No labels
You must log in to comment.