// ( c15.C ) // クラス階層の設計−その2 // // 【仮想関数部と共通デ−タ部を分けた場合】 #include // 仮想関数を集めたクラスと、派生クラスの共通 class Base { // デ−タ部を集めたクラスとでは性質が異なるた public: // め、クラスを分けようという発想。 virtual void show_color() = 0 ; } ; class Atr: public Base { // Point1,Point2,Coor1,Coor2 で共通のデ−タを protected: // 保存する基底クラス。問題はインスタンスを生 int color ; // 成できてしまうこと。 // void show_color() = 0 ; // 何だったら、この様にしてしまってもよい。 } ; // virtual void show_color() = 0 でもよい。 // 参考:多分このクラス階層の作り方が分かり易 class Point1: public Atr { // く、一般的になっているのでないか。 public: Point1(void) { color = 1 ; } void show_color() { cout << "Point1 Color = " << color << endl ; } } ; class Point2: public Atr { 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 ; } /* [参考] Base と Atr を反対にしても、問題なく実行する。しかし class Atr { int color ; クラス階層から考えると、あまりよい方法とは思えない。 class Base: public Atr { virtual void show_color() = 0 ; class Point1: public Base { class Point2: public Base { */