// piste.cpp, esimerkki perinnasta // ja luokista/vl-96 #include // Esimerkki ehdollisesta kaantamisesta: #define RTTI // RTTI = Run Time Type Information, // toimii esim. BC++ 4.5 alkaen #ifdef RTTI #include #endif //------------------------------------------- class caGraafinenOlio { protected: int x,y; int nakyy; int paikka(int nx,int ny) { x = nx; y = ny; return 0; } public: caGraafinenOlio(int ix=0, int iy=0) { paikka(ix,iy); nakyy = 0; } virtual ~caGraafinenOlio() { } int nakyvissa() const { return nakyy; } int sammuta(); int sytyta(); int siirra(int nx, int ny) { if ( !nakyvissa() ) return paikka(nx,ny); sammuta(); paikka(nx,ny); return sytyta(); } virtual int piirra() const = 0; virtual int tulosta(const char *s="") const { # ifdef RTTI printf("%-10s: ",typeid(*this).name()); # endif printf("%-10s (%02d,%02d)",s,x,y); return 0; } }; int caGraafinenOlio::sammuta() { if ( !nakyvissa() ) return 1; printf("Sammutettu: "); nakyy = 0; return piirra(); } int caGraafinenOlio::sytyta() { if ( nakyvissa() ) return 1; printf("Sytytetty: "); nakyy = 1; return piirra(); } //------------------------------------------- class caSateellinenOlio : public caGraafinenOlio { protected: int r; int koko(int nr) { r = nr; return 0; } public: caSateellinenOlio(int ix=0,int iy=0, int ir=1) : caGraafinenOlio(ix,iy), r(ir) {} virtual int tulosta(const char *s="") const { caGraafinenOlio::tulosta(s); printf( " r=%d",r); return 0; } int muuta_koko(int nr) { if ( !nakyvissa() ) return koko(nr); sammuta(); koko(nr); return sytyta(); } }; //------------------------------------------- class cPiste : public caGraafinenOlio { public: cPiste(int ix=0, int iy=0) : caGraafinenOlio(ix,iy) {} virtual ~cPiste() { sammuta(); } virtual int piirra() const { tulosta("Piste"); printf("\n"); return 0;} }; //------------------------------------------- class cYmpyra : public caSateellinenOlio { public: cYmpyra(int ix=0, int iy=0, int ir=1) : caSateellinenOlio(ix,iy,ir) {} virtual ~cYmpyra() { sammuta(); } virtual int piirra() const { tulosta("Ympyra"); printf("\n"); return 0;} }; int main(void) { caGraafinenOlio *p; caGraafinenOlio *kuvat[10]; int i; cPiste p1,p2(10,20); cYmpyra y1(1,1,2); p1.sytyta(); p2.sytyta(); p1.siirra(7,8); y1.sytyta(); y1.muuta_koko(5); // Esimerkki polymorfismista p = new cYmpyra(9,9,9); p->sytyta(); p->siirra(8,8); // p->muuta_koko(4); ei laillinen # ifdef RTTI // if ( typeid(*p) == typeid(cYmpyra) ) caSateellinenOlio *ps = dynamic_cast(p); if ( ps ) ps->muuta_koko(4); #else ((caSateellinenOlio *)p)->muuta_koko(4); # endif delete p; // Esimerkki polymorfismista kuvat[0] = new cYmpyra(10,10,100); kuvat[1] = new cPiste(11,11); kuvat[2] = new cYmpyra(12,12,102); kuvat[3] = NULL; for (i=0; kuvat[i];i++) kuvat[i]->sytyta(); for (i=0; kuvat[i];i++) delete kuvat[i]; return 0; }