仮想デストラクタ

こんなプログラムを見た。

class Base{
public:
    Base() : _id( 0 ){}
    Base( int id ) : _id( id ){}
    int GetID(){ return _id; }
private:
    int _id;
};

class Hoge : public Base{
public:
    Hoge( int id ) : Base( id ){}
};

class Hogehoge : public Base{
public:
    Hogehoge( int id ) : Base( id ){}
};
Base* p[ 3 ];
// 生成
p[ 0 ] = new Hoge( 1 );
p[ 1 ] = new Hogehoge( 2 );
p[ 2 ] = new Hoge( 1 );

...

// 解放
for( int i = 0 ; i < 3 ; i++ ){
    if( p[ i ] == null ) continue;
    switch( p[ i ]->GetID() ){
    case 0:     delete (Base*)p[ i ];     break;
    case 1:     delete (Hoge*)p[ i ];     break;
    case 2:     delete (Hogehoge*)p[ i ]; break;
    }
}

かっこよすぎる(ノ∀`)