Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

elain.h:

Code Block
#include <iostream><stdio.h>

using namespace std;

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

lehma.h:

Code Block
#include "elain.h"

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

main.cpp:

Code Block
#include "elain.h"
#include "lehma.h"

int main()
{
    CLehma lehma;
    lehma.TulostaLuokanNimi();

    CElain elain;
    elain.TulostaLuokanNimi();
}

...

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

Olion jäsenfunktioiden käyttö perillisestä

Vanhemman luokan jäsenfunktioita voidaan kutsua normaalisti, jos niitä ei ole ylikuormitettu.
Jos ne on ylikuormitettu, oletuksena kutsutaan aina perillisen versiota. Mieti seuraavaa tilannetta:

Code Block

#include "elain.h"

class CLehma : public CElain
{
public:
    void TulostaLuokanNimi()
    {
        TulostaLuokanNimi();
        printf("Luokan nimi on CLehma.\n");
    }
};

Tämä on loputon rekursio, eli funktio kutsuu itseään loputtomasti, sillä siinä ei ole lopetusehtoa.
Jos taas tarkoituksena oli kutsua vanhemman (CElain) TulostaLuokanNimi()-funktiota täytyy se määritellä eksplisiittisesti:

Code Block

#include "elain.h"

class CLehma : public CElain
{
public:
    void TulostaLuokanNimi()
    {
        CElain.TulostaLuokanNimi();
        printf("Luokan nimi on CLehma.\n");
    }
};

Tämä koodi toimii halutulla tavalla, eli CLehma-luokasta luodun olion TulostaLuokanNimi()-funktio kutsuu ensin vanhempansa, eli CElain-luokan funktiota TulostaLuokanNimi(), jonka jälkeen se tulostaa ruudulle oman tekstinsä.