7

訪問者パターンを示す例をいくつか見てきました。それらのすべてで、派生した各訪問済み要素は、通常 Accept() メソッドと呼ばれるものを実装します。

色の階層では、このメソッドは次のようになります。

void Red::accept(Visitor *v)
{
    v->visit(*this);
}

void Blue::accept(Visitor *v)
{
    v->visit(*this);
}

Visitor とその継承者にメソッドがある場合:

visit(Red red);
visit(Blue blue)

私の質問は、これを基本クラス (この例ではColor) でのみ同じ方法で実装しない理由です。ポリモーフィズムが機能します。つまり、オブジェクトが aRedの場合、 this の動的型はRedsoであるため、正しい訪問が呼び出されます。逆参照すると が生成され、Redそれが順番に visit(red) が呼び出されますか?

私は何が欠けていますか?

4

3 に答える 3

8

継承ポリモーフィズム (動的ディスパッチ) は、関数の引数には適用されません。つまり、オーバーロードされた関数は、渡される引数の静的型で選択されます。基本クラスColorで実装されている場合、v->visit(*this)は常に を呼び出しますvisit(Color c)

于 2013-06-19T12:25:35.837 に答える
1

あなたacceptが持っていたのは...

void Color::accept(Visitor* v)
{
    v->visit(*this);
}

visit基本クラスで呼び出されるだけです。visit正しい派生クラスで呼び出すにはColor、正しく型指定された を渡すことができるようにそれぞれを実装する必要がthisあるため、正しいvisitオーバーロードが呼び出されます。

于 2013-06-19T12:25:20.470 に答える