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

Compare with Current View Page History

« Previous Version 5 Next »

Periytyminen

Luokkahierarkiaa suunniteltaessa kannattaa yleiset, usean luokan tarvitsemat toiminnot ja ominaisuudet kerätä omiin luokkiinsa, joista sitten periytetään varsinaiset ohjelmassa käytettävät luokat. Periyttämisestä käytetään myös nimeä erikoistaminen (specialization) ja vastaavasti yhteisten metodien ja muuttujien siirtämistä omaan luokkaansa kutsutaan yleistämiseksi (generalization). Perimimisjärjestyksessä aikaisempaa luokkaa kutsutaan vanhemmaksi (parent) ja siitä perivää luokkaa lapseksi (child).

Periytyminen C++:ssa esitetään seuraavasti:

class Perillinen : [määre] Vanhempi
{
...

jossa [määre] on yleensä public (joskus harvoin protected tai private).

Esimerkki 1. Periytyminen.

Seuraavassa on esitetty ensin yleinen kantaluokka CElain:

class CElain
{
private:   // saatavissa vain luokan funktioilla
    char m_Kutsumanimi[100];
    int m_Massa;

public:   // voidaan käyttää luokan ulkopuolelta
    void AsetaNimi(char Nimi[]);
    char* KysyNimi(char Nimi[]);
    void AsetaMassa(int Massa);
    int KysyMassa();
};

Seuraavaksi on erikoistettu luokka, joka esittää eläintä kissa, siihen sisällytettään kaikki vain kissalle ominaiset piirteet.

class CKissa : public CElain
{
private:   // saatavissa vain luokan funktioilla

public:   // voidaan käyttää luokan ulkopuolelta
    void Kehraa();
}

Luokan CKissa edustaja perii protected ja public-tyyppiset CElain-luokan metodit ja jäsenmuuttujat. Kts. näkyvyys.

Huom! public-määre ennen perittävää luokkaa määrittelee perinnän näkyvyyden. Perinnässä voidaan käyttää myös private ja protected -määreitä, mutta niiden käyttö on erittäin harvinaista.

Vanhemman funktioiden ylikirjoitus perillisessä

Perityn luokan funktoita voidaan ylikirjoittaa perillisessä. Kutsuttaessa funktoita perillisen olion kautta suoritetaan perillisessä ylikirjoitettu funktio.

Esimerkki 2. Funktion ylikirjoitus perillisessä.

#include <iostream>

using namespace std;

class CElain
{
public:   // voidaan käyttää luokan ulkopuolelta
 void TulostaLuokanNimi()
 { 
  cout << "Luokan nimi on CElain." << endl; 
 }
};

class CLehma : public CElain
{
public:
 void TulostaLuokanNimi()
 { 
  cout << "Luokan nimi on CLehma." << endl; 
 }
};

int main()
{
 CLehma lehma;
 lehma.TulostaLuokanNimi();
 CElain elain;
 elain.TulostaLuokanNimi();
}

Testatkaa mitä main():ssa tehdyt funktiokutsut tulostavat.

  • No labels
You must log in to comment.