// 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 caKuvio { protected: int x,y; int nakyy; int paikka(int nx,int ny) { x = nx; y = ny; return 0; } public: caKuvio(int ix=0, int iy=0) { paikka(ix,iy); nakyy = 0; } virtual ~caKuvio() { } virtual int piirra() const = 0; 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 tulosta(const char *s="") const { # ifdef RTTI printf("%-10s: ",typeid(*this).name()); # endif printf("%-10s (%02d,%02d)",s,x,y); return 0; } }; int caKuvio::sammuta() { if ( !nakyvissa() ) return 1; printf("Sammutettu: "); nakyy = 0; return piirra(); } int caKuvio::sytyta() { if ( nakyvissa() ) return 1; printf("Sytytetty: "); nakyy = 1; return piirra(); } //------------------------------------------- class caKuvioJollaSade : public caKuvio { protected: int r; int koko(int nr) { r = nr; return 0; } public: caKuvioJollaSade(int ix=0,int iy=0, int ir=1) : caKuvio(ix,iy), r(ir) {} virtual int tulosta(const char *s="") const { caKuvio::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 caKuvio { public: cPiste(int ix=0, int iy=0) : caKuvio(ix,iy) {} virtual ~cPiste() { sammuta(); } virtual int piirra() const { tulosta("Piste"); printf("\n"); return 0;} }; //------------------------------------------- class cYmpyra : public caKuvioJollaSade { public: cYmpyra(int ix=0, int iy=0, int ir=1) : caKuvioJollaSade(ix,iy,ir) {} virtual ~cYmpyra() { sammuta(); } virtual int piirra() const { tulosta("Ympyra"); printf("\n"); return 0;} }; int main(void) { caKuvio *p; caKuvio *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) ) caKuvioJollaSade *ps = dynamic_cast(p); if ( ps ) ps->muuta_koko(4); #else ((caKuvioJollaSade *)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; }