2

私の C++ は少し錆びています。これが私がやろうとしていることです:

class Cmd { };
class CmdA : public Cmd { };
class CmdB : public Cmd { };
...
Cmd *a = new CmdA ();
Cmd *b = new CmdB ();

最初の問題:

cout << typeid (a).name ()
cout << typeid (b).name ()

どちらも Cmd * タイプを返します。私の望む結果は CmdA* と CmdB* です。これを達成するための次の方法以外の方法:

if (dynamic_cast <CmdA *> (a)) ...

第二に、私はこのようなことをしたいと思います:

class Target {
    public:
        void handleCommand (Cmd *c) { cout << "generic command..." }
        void handleCommand (CmdA *a) { cout << "Cmd A"; }
        void handleCommand (CmdB *b) { cout << "Cmd B"; }
};

Target t;
t.handleCommand (a);
t.handleCommand (b);

出力「Cmd A」と「Cmd B」を取得します。現在、「汎用コマンド...」が 2 回出力されます。

ありがとう

4

2 に答える 2

8

ああ、しかし、それtypeid(a).name()Cmd*として定義されているためCmd*です。typeid(*a).name()戻るべきCmdA

http://en.wikipedia.org/wiki/Typeid

また、 typeid に渡すものの基本クラスには仮想関数が必要です。そうでない場合は、基本クラスが返されます。

MSDN には、それについてより雄弁な説明があります。

式が基本クラスの型を指しているが、オブジェクトが実際にはその基本クラスから派生した型である場合、派生クラスの type_info 参照が結果になります。式は多相型 (仮想関数を持つクラス) を指している必要があります。それ以外の場合、結果は式で参照される静的クラスの type_info になります。さらに、ポインターが指すオブジェクトが使用されるように、ポインターを逆参照する必要があります。ポインターを逆参照しないと、結果はポインターが指すものではなく、ポインターの type_info になります。

于 2009-12-15T01:06:54.517 に答える
1

ダブル/マルチディスパッチの後にいるようです... C++ にハッキングするための情報については、こちらをご覧ください。Visitor パターンも見てください。

あなたが本質的にやりたいことは、型を把握するための動的キャストと、適切なハンドル コマンドを呼び出すための静的キャストだと思います。そうは言っても、私のC ++も錆びています:-)

于 2009-12-15T01:06:03.537 に答える