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

...

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

Esimerkki 1. Moniperiytyminen.

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

...

CHevonen:

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

CLintu:

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

CPegasus:

Code Block
class CPegasus :
    public CHevonen,
    public CLintu
{
};

main:

Code Block
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

Image Added
Kuva 1. Esimerkin 1 UML-luokkakaavio.
 

Esimerkki 2. Moniperiytymisen ongelma.

CHevonen:

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

CLintu:

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

CPegasus:

Code Block
class CPegasus :
    public CHevonen,
    public CLintu
{
};

main:

Code Block
int main()
{
    CPegasus pegasus;

    pegasus.Syo();
}

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

Image Added
Kuva 2. Esimerkin 2 UML-luokkakaavio.

Ratkaisu:

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

...