// 名稱: veh_inh.cc // 作者: 洪朝貴 http://www.cyut.edu.tw/~ckhung/ // 功能: 示範繼承相關問題 // 日期: 11-1999 // 編譯方式: // 1. 一併取得 ../c/sitio.c 與 ../c/sitio.h // 2. gcc -Wall sitio.c veh_inh.cc extern "C" { #include #include "sitio.h" } class object { public: int x, y; void draw() const {} void clear() const {} void move(int dx, int dy); }; class wheel : public object { public: wheel(int x0, int y0) { x = x0; y = y0; } void draw() const; void clear() const; }; class vehicle : public object { public: const char style; wheel front_wh, rear_wh; vehicle(int x0, int y0, char st = '-') : style(st), front_wh(x0-5, y0), rear_wh(x0+5, y0) { x = x0; y = y0; } void draw() const; void clear() const; void move(int dx, int dy); }; class ambulance : public vehicle { public: ambulance(int x0, int y0, char st = '*') : vehicle(x0, y0, st) {} void draw() const; }; class jet_ambulance : public ambulance { public: jet_ambulance(int x0, int y0, char st = '@') : ambulance(x0, y0, st) {} void draw() const; }; inline void gotoxy(int x, int y) { gotorc(25-y, x); } void object::move(int dx, int dy) { x += dx; y += dy; } void wheel::draw() const { gotoxy(x-1,y+1); printf("/-\\"); gotoxy(x-1,y); printf("|o|"); gotoxy(x-1,y-1); printf("\\-/"); } void wheel::clear() const { gotoxy(x-1,y+1); printf(" "); gotoxy(x-1,y); printf(" "); gotoxy(x-1,y-1); printf(" "); } void vehicle::draw() const { int k; front_wh.draw(); rear_wh.draw(); gotoxy(x-6, y+5); for (k=-6; k<=6; ++k) putchar(style); gotoxy(x-3, y); for (k=-3; k<=3; ++k) putchar(style); for (k=0; k<=5; ++k) { gotoxy(x-7, y+k); putchar('|'); gotoxy(x+7, y+k); putchar('|'); } } void vehicle::clear() const { front_wh.clear(); rear_wh.clear(); for (int k=0; k<=5; ++k) { gotoxy(x-7, y+k); printf("%15s", ""); } } void vehicle::move(int dx, int dy) { object::move(dx, dy); front_wh.move(dx, dy); rear_wh.move(dx, dy); } void ambulance::draw() const { vehicle::draw(); gotoxy(x-4, y+6); printf("O"); } void jet_ambulance::draw() const { ambulance::draw(); gotoxy(x+8, y); printf("<<"); gotoxy(x-4, y+3); printf("j-a"); } #include void race(vehicle * a, vehicle * b) { int k; a->draw(); b->draw(); while (a->x > 10 || b->x > 10) { getkey(); k = (a->x<=10) ? 1 : (b->x<=10) ? 0 : rand()%2; if (k) { b->clear(); b->move(-1, 0); b->draw(); } else { a->clear(); a->move(-1, 0); a->draw(); } } } int main(void) { initsitio(); { clearscr(); vehicle v0(10,10); ambulance v1(30, 10); jet_ambulance v2(50, 10); v0.draw(); getkey(); v1.draw(); getkey(); v2.draw(); getkey(); v0.clear(); getkey(); v1.clear(); getkey(); v2.clear(); getkey(); } { clearscr(); jet_ambulance v0(70, 5); ambulance v1(70, 15); race(&v0, &v1); } gotoxy(1,1); return 0; }