>>767
では、>>766を踏まえて要求仕様を。
やりたいことを簡単に説明すると、switch分岐の、動的な変更です。
fooに文字列"hoge"が渡されたら、関数ポインタ経由でHoge()を呼び出します。
fooに文字列"sage"が渡されたら、関数ポインタ経由でSage()を呼び出します。
fooに未知の文字列が渡されたら、例外を出すなどのエラー処理をします。
『この文字列ならこの関数を呼び出す』というペアのいくつかはコンパイル時に
決定していますが、実行時に新たなペアが増える場合もありますし、
減る場合もあります。
『現時点で、ここには分岐できるが、ここには分岐できない』といった動的な情報は、
プログラム全体でひとつしかありません。
そういう状況です。それを達成するのに最もエレガントなコードが、>>766
のコードのつもりです。
・動的な分岐はmapの連想配列でこなす。
・ひとつしかない動的な情報は、ローカルstaticオブジェクトが保有。
・コンパイル時に決定されているペアは、オブジェクトのコンストラクタで入力。
という方針です。
もし、More Effective C++ を持ってるんでしたら、項目31を参照してください。
同じようなことをやってあります(ただし、あっちは絶対にpublic継承を
やりたくないのか、面倒な手段で実現してあります)。

>>780-782
C++3rdを持っていないのでEffective C++ からの引用ですが、
『C++標準規格は、この点について極めて明確に述べている。
基底クラスのポインタを介して派生クラスのオブジェクトを削除しようと
するとき、その基底クラスに仮想でないデストラクタがあると、
その結果は不定となる』
だそうです。プログラマとしての直感から言えば、たしかに、派生クラスで
メンバを追加してなくてデストラクタで何もしてないんなら、正常に
動いてくれそうな予感はします。けど、そういった条件は全く書かれずに
『不定』だと書いてあるんですから、やっちゃいけないというか、
『やれないようにクラス設計する覚悟がなければpublic継承してはいけない』
んではないでしょうか。