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

Moniperiytyminen

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. Yksi tapa toteuttaa edellä kuvattu luokka on periyttää sen ominaisuudet kahdesta luokasta: CHevonen ja CLintu.

CHevonen:

Code Block

class CHevonen
{
public:
    void Aantele() {
       
Wiki Markup
h2. 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 3. Moniperiytyminen.

class CHevonen
{
    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.

Image Added
Kuva 1. Esimerkin 1 UML-luokkakaavio.
 

Esimerkki 2. Moniperiytymisen ongelma.

CHevonen:

Code Block
 piirteet.

Yksi ongelma moniperiytymisessä tulee vastaan, jos molemmilla  perittävillä luokilla on samanniminen metodi. Esimerkiksi Syo()-metodi.

Esimerkki 4. Moniperiytymisen ongelma.

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ää:

Code Block

int main()
{
       CPegasus pegasus;

       pegasus.  CLintu::Syo();
}

h3. *

Moniperintä

...

ohjelmointikielissä

...

Kaikki

...

olio-ohjelmointikielet

...

eivät

...

tue

...

moniperintää,

...

kuten

...

esim

...

Java.

...

Moniperintä

...

on

...

kuitenkin tuettu

...

C++-kielessä

...

.