// elukat.cpp // Malliohjelma perimisesta ja polymorfismista (monimuotoisuudesta) // Vesa Lappalainen 12.2.1999 #include #include using namespace std; //--------------------------------------------------------------------------- // cElain //--------------------------------------------------------------------------- class cElain { // TElain, CElain string nimi; double paino; int ika; public: cElain(const string &inimi); virtual ~cElain() { cout << "Elain Moikka: " << nimi << endl; } virtual void kasva(double dm=0.1); virtual void tulosta() const; virtual void vanhene(int v=1); virtual void aantele() const; virtual 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 { int hannanpituus; int *jalat; public: cKissa(const string &inimi,int hp=5) : cElain(inimi), hannanpituus(hp) { // hannanpituus = hp; jalat = new int[4]; // malloc calloc jalat[0] = 6; jalat[1] = 6; jalat[2] = 8; jalat[3] = 8; } // cKissa(..) { super(nimi); } virtual ~cKissa() { delete[] jalat; // free cout << "Kissa Moikka: " << endl; } virtual void aantele() const { cout << "Miuaa" << endl; } virtual void tulosta() const { // tulosta tässä jalkojen pituudet cout << "Hannanpituus: " << hannanpituus << " "; cElain::tulosta(); } }; //--------------------------------------------------------------------------- // cKoira //--------------------------------------------------------------------------- class cKoira : public cElain { int &kuono; public: cKoira(const string &inimi,int &k) : cElain(inimi) ,kuono(k) { } virtual void aantele() const; virtual void tulosta() const { // tulosta tässä jalkojen pituudet cout << "Kuono: " << kuono << " "; cElain::tulosta(); } }; void cKoira::aantele() const { cout << "Hauhau" << endl; kuono++; } //--------------------------------------------------------------------------- // 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) { int k = 5; cKissa mirri("Miuku",10); /// Automaattinen olio cKissa kolli("Molli"); cKoira musti("Musti",k); mirri.tulosta(); mirri.aantele(); mirri.kasva(500); mirri.tulosta(); musti.aantele(); musti.aantele(); musti.aantele(); musti.tulosta(); cElain *elain = new cKissa("LuotuKissa"); elain->aantele(); delete elain; /* 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; }