// elukat.cpp // Malliohjelma perimisesta ja polymorfismista (monimuotoisuudesta) // Vesa Lappalainen 12.2.1999 #include #include using namespace std; //--------------------------------------------------------------------------- // cElain //--------------------------------------------------------------------------- class cElain { string nimi; double paino; int ika; public: cElain(const string &inimi); void kasva(double dm); void tulosta() const; void vanhene(int v=1); virtual void aantele() const; }; cElain::cElain(const string &inimi) { nimi = inimi; ika = 0; paino = 0.1; } void cElain::kasva(double dm) // scope resolution operator :: { paino += dm; if ( paino < 0.1 ) paino = 0.1; } void cElain::tulosta() const { cout << "Elain: " << nimi << " " << paino << " " << ika << "\n"; } void cElain::vanhene(int v) { if ( v < 0 ) return; ika += v; } void cElain::aantele() const { cout << "???!" << endl; } //--------------------------------------------------------------------------- // cKissa //--------------------------------------------------------------------------- class cKissa : public cElain { public: cKissa(const string &inimi) : cElain(inimi) {} virtual void aantele() const { cout << "Miuaa"; } }; //--------------------------------------------------------------------------- // cKoira //--------------------------------------------------------------------------- class cKoira : public cElain { public: cKoira(const string &inimi) : cElain(inimi) {} virtual void aantele() const { cout << "Hauhau"; } }; //--------------------------------------------------------------------------- // Polymorfismia esitteleviä aliohjelmia //--------------------------------------------------------------------------- // Esimerkki polymorfismista referenssin kanssa void aantele(const cElain &elain) { elain.aantele(); } // Esimerkki polymorfismista osoittimen kanssa void kasvata(cElain *elain, double dm) { elain->kasva(dm); elain->tulosta(); } // Esimerkki polymorfismismin toimimattomuudesta arvojen kanssa // eli vain osoittimet ja referenssit voivat olla polymorfisia void vanhenna(cElain elain) { elain.vanhene(); elain.aantele(); elain.tulosta(); } //--------------------------------------------------------------------------- int main(void) { cKissa mirri("Miuku"); cKissa kolli("Molli"); cKoira musti("Musti"); mirri.tulosta(); musti.tulosta(); kolli.tulosta(); mirri.kasva(1.2); mirri.tulosta(); kolli.kasva(-0.5); kolli.tulosta(); mirri.vanhene(); mirri.tulosta(); mirri.vanhene(-3); mirri.tulosta(); mirri.tulosta(); mirri.aantele(); kolli.aantele(); musti.aantele(); // Polymorfismitesti referenssin ja osoittimen kanssa cout << "\n---------------------------------------------------\n"; aantele(mirri); aantele(kolli); aantele(musti); cout << "\n"; kasvata(&mirri,1); kasvata(&kolli,2); kasvata(&musti,0.5); vanhenna(mirri); mirri.tulosta(); // Arvoilla polymorfismi ei toimi! return 0; }