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()
};
class CLehma : public CElain
{
public:
void TulostaLuokanNimi()
};
int main()
{
CLehma lehma;
lehma.TulostaLuokanNimi();
CElain elain;
elain.TulostaLuokanNimi();
}
Testatkaa mitä main():ssa tehdyt funktiokutsut tulostavat.