// ( c14.C ) // クラス階層の設計−その1 // #include // 【仮想関数部と共通デ−タ部を1つにした場合】 // |-- Point1-- Coor1 作成しようとするクラス階層 // Base--| // |-- Point2-- Coor2 class Base { // 基底クラス:派生クラスで共通な colorデ−タを protected: // 含み、派生クラスで内容が異なる show_color 関 int color ; // 数を仮想関数にしてある。 public: virtual void show_color() = 0 ; } ; // Base クラスはインスタンスを生成しないので、 // 仮想関数を純粋仮想関数にした。 class Point1: public Base { public: Point1(void) { color = 1 ; } void show_color() { cout << "Point1 Color = " << color << endl ; } } ; class Point2: public Base { public: Point2() { color = 2 ; } void show_color() { cout << "Point2 Color = " << color << endl ; } } ; class Coor1: public Point1 { int x,y ; public: Coor1() { x = y = 1 ; color = 3 ; } // show_color 関数の内容を変更する void show_color() { cout << "Coor1 Color = " << color << endl ; } } ; class Coor2: public Point1 { int x,y ; public: Coor2() { x = y = 1 ; } void show_color() {} // show_color 関数を無効にする } ; main() { void* List[5] ; Point1* p1 = new Point1() ; List[0] = p1 ; Point2* p2 = new Point2() ; List[1] = p2 ; Coor1* c1 = new Coor1() ; List[2] = c1 ; Coor2* c2 = new Coor2() ; List[3] = c2 ; List[4] = NULL ; for ( int i=0;List[i] != NULL;i++ ) ((Base*)List[i])->show_color() ; delete p1 ; delete p2 ; delete c1 ; delete c2 ; } /* [結果] Point1 Color = 1 Point2 Color = 2 Coor1 Color = 3 */