/* teht1.CPP M 2.19, Malliesimerkki perimisestä. */ #include #include //**************************************************************************** char *Tilat[] = {"Sammutettu","Sytytetty"}; //**************************************************************************** class kuvio_jolla_kp { // Abstrakti luokka int nakyy; // Sytytetty vai sammutettu int vaihda_paikka(int nx, int ny) { x = nx; y = ny; return nakyy; } protected: // Jos halutaan periä luokka, pitää yht. osien olla prot char nimi[20]; // Nimi, jotta osatataan tulostaa mistä oliosta kyse int x,y; // Koordinaatit public: kuvio_jolla_kp(char *s="kuvio jolla keskipiste",int ix=0,int iy=0) { nakyy = 0; vaihda_paikka(ix,iy); strcpy(nimi,s); } // virtual ~kuvio_jolla_kp() { sammuta(); } // Ei saa olla sammuta int nakyvissa() { return nakyy; } int sammuta() { if ( !nakyy ) return 0; nakyy = 0; return piirra(); } int sytyta() { if ( nakyy ) return 1; nakyy = 1; return piirra(); } int siirra(int nx=0,int ny=0) { if ( !nakyvissa() ) return vaihda_paikka(nx,ny); sammuta(); vaihda_paikka(nx,ny); return sytyta(); } virtual int piirra() = 0; // Pure virtual! }; //**************************************************************************** class kuvio_jolla_sade : public kuvio_jolla_kp { // Abstrakti luokka protected: int r; public: kuvio_jolla_sade(char *s="kuvio_jolla_sade",int ix=0,int iy=0, int ir=1) : kuvio_jolla_kp(s,ix,iy){ r = ir; } // ~kuvio_jolla_sade() { sammuta();} // Ei tarvi, eikä saa olla sammuta virtual int muuta_koko(int nr) {// lisäksi koon muuttaminen if ( !nakyvissa() ) { r = nr; return 0; } sammuta(); r = nr; return sytyta(); } }; //**************************************************************************** class piste : public kuvio_jolla_kp { public: piste(char *s="piste",int ix=0,int iy=0) : kuvio_jolla_kp(s,ix,iy) { }; virtual ~piste() { sammuta(); } // Tämä täytyy olla jokaisella luokalla oma virtual int piirra() { // Suorittaa olion todellisen piirtämisen, oma jok. printf("Piste : %-10s %-10s:(%02d,%02d)\n",Tilat[nakyvissa()],nimi,x,y); return nakyvissa(); } }; //**************************************************************************** class ympyra : public kuvio_jolla_sade { public: ympyra(char *s="ympyrä",int ix=0,int iy=0, int ir=1) : kuvio_jolla_sade(s,ix,iy,ir) { } ~ympyra() { sammuta();} 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(); }; }; //**************************************************************************** class nelio : public kuvio_jolla_sade { public: nelio(char *s="neliö",int ix=0,int iy=0, int ir=1) : kuvio_jolla_sade(s,ix,iy,ir) { } ~nelio() { sammuta();} // Pakko olla, muuten ei toimi int nelio::piirra() { // Neliön todellinen piirtäminen printf("Neliö: %-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); nelio n("n",4,5,175); n.sytyta(); a.sytyta(); y.sytyta(); b.sytyta(); a.siirra(3,3); b.siirra(); y.muuta_koko(7); return 0; } /* Tulostus: --------------------------------------------------------------- Neliö: Sytytetty n :(04,05) r=175 Piste : Sytytetty a :(00,00) Ympyrä: Sytytetty y :(03,03) r=1 Piste : Sytytetty b :(02,05) Piste : Sammutettu a :(00,00) Piste : Sytytetty a :(03,03) Piste : Sammutettu b :(02,05) Piste : Sytytetty b :(00,00) Ympyrä: Sammutettu y :(03,03) r=1 Ympyrä: Sytytetty y :(03,03) r=7 Neliö: Sammutettu n :(04,05) r=175 Ympyrä: Sammutettu y :(03,03) r=7 Piste : Sammutettu b :(00,00) Piste : Sammutettu a :(03,03) */