// ( t2.C ) // 仮想デストラクタ // #include class Base { protected: int color ; public: virtual void show() = 0 ; virtual ~Base() { cout << "base\n" ; } } ; class Point: public Base { public: Point( int c=1 ) { color = c ; } void show() { cout << "color = " << color << endl ; } ~Point() { cout << "point " ; } } ; main() { // 例題1 Point* q = new Point ; delete q ; // point と base を表示, ~Base の場合も左に同じく表示 // 例題2 Base *a ; a = new Point(1) ; delete a ; // point と base を表示, ~Base の場合は base のみ表示 // 例題3 Point* p = new Point(2) ; Base* b = p ; // 同じ場所を差し示している b->show() ; // 2 p->show() ; // 2 delete b ; // point と base を表示, ~Base の場合は base のみ表示 // p->show() ; ポインタ p も同時に消えてしまっているのでエラ−になる } /* [注意] 仮想デストラクタの機能がないと困る場合がある。Point クラスのコンストラクタで new を使うような場合、デストラクタには当然 delete を記述する。例題3のように Point インスタンスを、基底クラス Base で消去してしまった場合にも、Point で new したのをきちんと delete したい。この時 Point のデストラクタに virtual と 宣言しておくと、自動的に処理してくれるようになる。 [参考] class V { public: 仮想でないデストラクタ ~V() を定義したら、コンストラクタ V() V() {} も定義しないとワ−ニングが出る。 ~V() {} } ; */