Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Moniperintä | Perinnän Yleiskatsaus
C++ OOP
course content

Kurssisisältö

C++ OOP

C++ OOP

1. C++:n OOP:n Perusteet
2. Konstruktorit ja Destruktorit
3. Kapseloinnin Yleiskatsaus
4. Perinnän Yleiskatsaus
5. Polymorfismin Yleiskatsaus

book
Moniperintä

Moniperintä mahdollistaa johdetun luokan perimisen useammasta kantaluokasta. Tämä tarkoittaa, että yhdellä johdetulla luokalla voi olla pääsy usean kantaluokan jäseniin (tietoihin ja funktioihin), jolloin niiden ominaisuudet ja käyttäytymiset yhdistyvät.

Horisontaalinen moniperintä

Tässä moniperinnän muodossa luokka perii ominaisuuksia ja metodeja useilta yläluokilta, jotka ovat samalla tasolla perintähierarkiassa. Tarkastellaan classes: Shape ja Color, joilla kummallakin on omat ominaisuutensa ja metodinsa. Shape määrittelee olion muodon ja Color määrittelee sen värin.

Shape.h

Shape.h

Color.h

Color.h

copy
1234567
class Shape { public: void setShape(const std::string& value) { shape = value; } std::string getShape() { return shape; } private: std::string shape; };

Luodaan nyt aliluokka nimeltä ColoredShape, joka perii ominaisuudet ja metodit sekä Shape- että Color-luokista.

ColoredShape.h

ColoredShape.h

copy
123456789
#include "Shape.h" #include "Color.h" class ColoredShape : public Shape, public Color { public: void describe() { std::cout << "This object is a " << getShape() << " shape and is " << getColor() << '\n'; } };

Vertikaalinen perintä

Syvässä perinnässä class perii ominaisuudet ja metodit suoralta vanhemmaltaan sekä tämän esivanhemmilta, muodostaen perintäketjun. Esimerkiksi class Vehicle voi toimia pohjana periytymiselle Car-, Truck- ja muille luokille. Tässä esimerkissä käytämme Car-luokkaa havainnollistamaan tätä käsitettä.

Vehicle.h

Vehicle.h

Car.h

Car.h

copy
12345
class Vehicle { public: void start() { std::cout << "Vehicle started"; } void stop() { std::cout << "Vehicle stopped"; } };

Saavuttaaksesi vertikaalisen periytymisen, sinun tulee luoda hierarkia, jossa yksi class perii toiselta, ja seuraava luokka perii ensimmäiseltä, ja niin edelleen. Voimme luoda ElectricCar-luokan, joka perii kaikki ominaisuudet ja toiminnot Car-luokalta, joka puolestaan perii Vehicle-luokalta, muodostaen näin monimutkaisen moniperiytymisen rakenteen.

ElectricCar.h

ElectricCar.h

copy
123456
#include "Car.h" class ElectricCar : public Car { public: void charge() { std::cout << "Electric car is charging"; } };

Miksi moniperintä on tarpeen

Moniperintä tarjoaa joustavuutta ja koodin uudelleenkäyttöä tilanteissa, joissa class täytyy ilmentää useamman kuin yhden vanhemman class ominaisuuksia tai käyttäytymistä. Tässä joitakin tilanteita, joissa moniperintä on hyödyllistä:

  • Reaalimaailman roolit: lentävä lintu voi yhdistää sekä Flying- että Bird-luokkien ominaisuudet, edustaen molempia kykyjä. Flying-luokkaa voidaan käyttää myös lentokoneisiin tai muihin lentäviin olioihin.

  • Koodin uudelleenkäyttö: moniperintä mahdollistaa luokan ominaisuuksien uudelleenkäytön eri kantaluokista ilman päällekkäisyyttä.

  • Tarkennetut rajapinnat: kannustaa yhdistämään pieniä, tarkkoja rajapintoja yhden suuren ja yleisen sijaan.

Note
Huomio

Jaa monimutkainen olio yksinkertaisempiin osiin ja hyödynnä moniperintää luodaksesi joustavaa ja ylläpidettävää ohjelmistoa.

question mark

Mikä seuraavista väittämistä vaakasuorasta perinnästä on oikein?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

course content

Kurssisisältö

C++ OOP

C++ OOP

1. C++:n OOP:n Perusteet
2. Konstruktorit ja Destruktorit
3. Kapseloinnin Yleiskatsaus
4. Perinnän Yleiskatsaus
5. Polymorfismin Yleiskatsaus

book
Moniperintä

Moniperintä mahdollistaa johdetun luokan perimisen useammasta kantaluokasta. Tämä tarkoittaa, että yhdellä johdetulla luokalla voi olla pääsy usean kantaluokan jäseniin (tietoihin ja funktioihin), jolloin niiden ominaisuudet ja käyttäytymiset yhdistyvät.

Horisontaalinen moniperintä

Tässä moniperinnän muodossa luokka perii ominaisuuksia ja metodeja useilta yläluokilta, jotka ovat samalla tasolla perintähierarkiassa. Tarkastellaan classes: Shape ja Color, joilla kummallakin on omat ominaisuutensa ja metodinsa. Shape määrittelee olion muodon ja Color määrittelee sen värin.

Shape.h

Shape.h

Color.h

Color.h

copy
1234567
class Shape { public: void setShape(const std::string& value) { shape = value; } std::string getShape() { return shape; } private: std::string shape; };

Luodaan nyt aliluokka nimeltä ColoredShape, joka perii ominaisuudet ja metodit sekä Shape- että Color-luokista.

ColoredShape.h

ColoredShape.h

copy
123456789
#include "Shape.h" #include "Color.h" class ColoredShape : public Shape, public Color { public: void describe() { std::cout << "This object is a " << getShape() << " shape and is " << getColor() << '\n'; } };

Vertikaalinen perintä

Syvässä perinnässä class perii ominaisuudet ja metodit suoralta vanhemmaltaan sekä tämän esivanhemmilta, muodostaen perintäketjun. Esimerkiksi class Vehicle voi toimia pohjana periytymiselle Car-, Truck- ja muille luokille. Tässä esimerkissä käytämme Car-luokkaa havainnollistamaan tätä käsitettä.

Vehicle.h

Vehicle.h

Car.h

Car.h

copy
12345
class Vehicle { public: void start() { std::cout << "Vehicle started"; } void stop() { std::cout << "Vehicle stopped"; } };

Saavuttaaksesi vertikaalisen periytymisen, sinun tulee luoda hierarkia, jossa yksi class perii toiselta, ja seuraava luokka perii ensimmäiseltä, ja niin edelleen. Voimme luoda ElectricCar-luokan, joka perii kaikki ominaisuudet ja toiminnot Car-luokalta, joka puolestaan perii Vehicle-luokalta, muodostaen näin monimutkaisen moniperiytymisen rakenteen.

ElectricCar.h

ElectricCar.h

copy
123456
#include "Car.h" class ElectricCar : public Car { public: void charge() { std::cout << "Electric car is charging"; } };

Miksi moniperintä on tarpeen

Moniperintä tarjoaa joustavuutta ja koodin uudelleenkäyttöä tilanteissa, joissa class täytyy ilmentää useamman kuin yhden vanhemman class ominaisuuksia tai käyttäytymistä. Tässä joitakin tilanteita, joissa moniperintä on hyödyllistä:

  • Reaalimaailman roolit: lentävä lintu voi yhdistää sekä Flying- että Bird-luokkien ominaisuudet, edustaen molempia kykyjä. Flying-luokkaa voidaan käyttää myös lentokoneisiin tai muihin lentäviin olioihin.

  • Koodin uudelleenkäyttö: moniperintä mahdollistaa luokan ominaisuuksien uudelleenkäytön eri kantaluokista ilman päällekkäisyyttä.

  • Tarkennetut rajapinnat: kannustaa yhdistämään pieniä, tarkkoja rajapintoja yhden suuren ja yleisen sijaan.

Note
Huomio

Jaa monimutkainen olio yksinkertaisempiin osiin ja hyödynnä moniperintää luodaksesi joustavaa ja ylläpidettävää ohjelmistoa.

question mark

Mikä seuraavista väittämistä vaakasuorasta perinnästä on oikein?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 3
some-alt