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