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