// elukat.cpp // Malliohjelma perimisesta ja polymorfismista (monimuotoisuudesta) // Vesa Lappalainen 12.2.1999 #include #include using namespace std; //--------------------------------------------------------------------------- // cElain //--------------------------------------------------------------------------- class cElain { private: string nimi; double paino; int ika; public: cElain(const string &inimi); virtual ~cElain() { cout << "Moikka: " << nimi << endl; } virtual void kasva(double dm); virtual void tulosta() const; virtual void vanhene(int v=1); virtual void aantele() const; void aseta(const string &nimi) { this->nimi = nimi; // nimi = "Kalle"; } }; 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 << "pööö" << endl; //aseta("kana"); } //--------------------------------------------------------------------------- // cKissa //--------------------------------------------------------------------------- class cKissa : public cElain { public: cKissa(const string &inimi) : cElain(inimi) { } // cKissa(..) { super(nimi); } ~cKissa() { cout << "Kissa Moikka: " << endl; } virtual void aantele() const { cout << "Miuaa"; } }; //--------------------------------------------------------------------------- // cKoira //--------------------------------------------------------------------------- class cKoira : public cElain { public: cKoira(const string &inimi) : cElain(inimi) {} virtual void aantele() const; }; void cKoira::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"); /// Automaattinen olio cKissa kolli("Molli"); cKoira musti("Musti"); string nimi = "Masi"; cElain *masi = new cKissa(nimi); masi->aseta(nimi); cout << nimi << "===============" << endl; masi->aantele(); (*masi).tulosta(); delete masi; //mirri.nuorene(); // mirri.ika--; 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! cElain *elukat[] = {&mirri,&musti}; elukat[1]->aantele(); return 0; }