/* POLYMOR.CPP Malliesimerkki perimisest„. Ohjelma matkii graafisia olioita, mutta todelliset piirt„miset tehd„„nkin tulostuksina olion ominaisuuksista. Kaikki voisivat olla my”s void tyyppi„, mutta joissakin tapauksissa niit„ p„„st„„n helpommin kutsumaan, mik„li ne palauttavat jotakin. Paluu arvoksi on nyt valittu tieto siit„, onko objekti n„kyviss„ vai ei. vl 19.10.1992 */ #include #include //**************************************************************************** char *Tilat[] = {"Sammutettu","Sytytetty"}; class piste { int tila; // Sytytetty vai sammutettu int vaihda_paikka(int nx, int ny); protected: // Jos halutaan peri„ luokka, pit„„ yht. osien olla prot char nimi[20]; // Nimi, jotta ostataan tulostaa mist„ oliosta kyse int x,y; // Koordinaatit public: piste(char *s="piste",int ix=0,int iy=0) { tila=0; x=ix; y=iy; strcpy(nimi,s); } ~piste() { sammuta(); }// Poistetaan olio aina lopuksi, nyt voi kutsua virt. int nakyvissa() { // Onko olio n„kyviss„ return tila; } int sammuta(); // Poistaa olion n„yt”st„ int sytyta(); // Sytytt„„ olion n„ytt””n int siirra(int nx=0,int ny=0); virtual int piirra() { // Suorittaa olion todellisen piirt„misen, oma jok. printf("Piste : %-10s %-10s:(%02d,%02d)\n",Tilat[nakyvissa()],nimi,x,y); return nakyvissa(); } }; int piste::vaihda_paikka(int nx, int ny) { x = nx; y = ny; return tila; } int piste::sammuta() { if ( !nakyvissa() ) return 0; tila=0; return piirra(); } int piste::sytyta() { if ( nakyvissa() ) return 1; tila=1; return piirra(); } int piste::siirra(int nx, int ny) { if ( !nakyvissa() ) return vaihda_paikka(nx,ny); sammuta(); vaihda_paikka(nx,ny); return sytyta(); } //**************************************************************************** class ympyra : public piste { protected: int r; public: ympyra(char *s="ympyra",int ix=0,int iy=0, int ir=1) : piste(s,ix,iy){ r = ir; } ~ympyra() { sammuta();} int muuta_koko(int nr) {// Ympyr„ll„ lis„ksi koon muuttaminen if ( !nakyvissa() ) { r = nr; return 0; } sammuta(); r = nr; return sytyta(); } int ympyra::piirra() { // Ympyr„n todellinen piirt„minen printf("Ympyr„: %-10s %-10s:(%02d,%02d) r=%d\n", Tilat[nakyvissa()],nimi,x,y,r); return nakyvissa(); }; }; //**************************************************************************** int main(void) { printf("---------------------------------------------------------------\n"); piste a("a"),b("b",2,5); ympyra y("y",3,3); piste *p=&a; p->sytyta(); p->piirra(); p = &y; p->sytyta(); p->piirra(); a.sytyta(); y.sytyta(); b.sytyta(); a.siirra(3,3); b.siirra(); y.muuta_koko(7); return 0; }