// ( c10.C ) // 基底クラスの役割の注意 // #include class Base { protected: int color ; public: virtual void show_color() { cout << "base class\n" ; } } ; class Point: public Base { public: Point( int c=2 ) { color = c ; } void show_color() { cout << "Point Color = " << color << "\n" ; } } ; main() { // 例題1 Base a ; a.show_color() ; // base class // 例題2 Base* b = new Base ; b->show_color() ; delete b ; // base class // 例題3 Base* c[2] ; Point* s1 = new Point(4) ; Point* s2 = new Point(5) ; c[0] = s1 ; c[1] = s2 ; c[0]->show_color() ; // Point Color = 4 delete s1 ; delete s2 ; // 例題4 Base* d[3] ; d[0] = new Base ; d[0]->show_color() ; // base class d[1] = new Base ; d[2] = new Base ; Point* p1 = new Point(6) ; Point* p2 = new Point(7) ; d[0] = p1 ; d[1] = p2 ; d[2] = NULL ; d[0]->show_color() ; // Point Color = 6 delete [3]d ; delete p1 ; delete p2 ; } /* [注意] 例題3、4は何を意味しているのだろうか。Baseクラスは純粋仮想関数を含んでいない から、インスタンスを生成できる。と言うことは Baseも Point クラスも、ちゃんと独 立したオブジェクトを作成できると言うことである。それでは、ちゃんとしたオブジェ クトに、これまたちゃんとしたオブジェクトを代入するということが、何の意味がある と言うのか。Base オブジェクトは、自分自身の存在を Point オブジェクトのために捧 げているようなものだ。ここでは Baseオブジェクトは Point オブジェクトの記憶用と しての意味しか持っていないことになってしまう。 Smalltalk では、このような使い方はできないようになっているらしい。C++はC言 語の流れを汲んでいるので、良く言えば柔軟、悪く言えばいい加減になっている。上記 のような場合、Base も Point オブジェクトもオブジェクトとして必要ならば、それら を記憶する別のクラスなりを導入するべきである。各種クラス・ライブラリにはコンテ ナ・クラスという何でも記憶してしまうクラスが用意されているので、実際にアプリケ −ションを作成する際には、そうしたものを利用することになるだろう。 以上のことは "bit" Vol.24,No.7,p793- の『謎のオブジェクト指向言語C++』に 同じような疑問が出されていた。 */