2010-12-02 12 views
0

何ですか、それらの違いは何ですか?複数のディスパッチとマルチメソッド

多くの情報源は、Wikipediaのように、請求彼らは同じことだが、他は明示的にthis questionSBIのように、反対のことを言う:

まず:「Visitorパターンは、二重派遣をシミュレートするための方法ですC++で。これは完全に正しいわけではありません。実際には、二重ディスパッチは、複数ディスパッチの1つの形式です。これは、C++で(欠落している)複数のメソッドをシミュレートする方法です。

答えて

5

これらは同じです。

C++で仮想メソッドを呼び出す場合、実際に実行されるメソッドは、メソッドが呼び出されるオブジェクトの実行時の型に基づいています。これは単一の引数(この場合は暗黙の 'this'引数)の型に依存するため、これは "単一ディスパッチ"と呼ばれます。したがって、たとえば、次のように実行すると

class Base { 
    public: 
    virtual int Foo() { return 3; } 
} 

class Derived : public Base { 
    public: 
    virtual int Foo() { return 123; } 
} 

int main(int argc, char *argv[]) { 
    Base* base = new Derived; 
    cout << "The result is " << base->Foo(); 
    delete base; 
    return 0; 
} 

、上記のプログラムはあまりよくありません。3.これまでのところ、123を印刷します。

複数ディスパッチは、この「this」ポインタの両方の型に対して、メソッドの引数の型にディスパッチする言語またはランタイムの能力です。 (一瞬C++構文にこだわっ)考えてみましょう:C++は、複数の発送を持っていた場合

class Derived; 

class Base { 
    public: 
    virtual int Foo(Base *b) { cout << "Called Base::Foo with a Base*"; } 
    virtual int Foo(Derived *d) { cout << "Called Base::Foo with a Derived*"; } 
} 

class Derived : public Base { 
    public: 
    virtual int Foo(Base *b) { cout << "Called Derived::Foo with a Base*"; } 
    virtual int Foo(Derived *d) { cout << "Called Derived::Foo with a Derived*"; } 
} 

int main(int argc, char *argv[]) { 
    Base* base = new Derived; 
    Base* arg = new Derived; 

    base->Foo(arg); 

    delete base; 
    delete arg; 
    return 0; 
} 

、プログラムは「Dervied *と派生:: Fooのいわゆる」プリントアウトでしょう。 (悲しいことに、C++は複数のディスパッチを持たないので、 "Called Derived :: Foo with Base *"を出力します)

ダブルディスパッチは、複数ディスパッチの特殊なケースです。言語機能としてはあまり一般的ではありません。ほとんどの言語は、単一ディスパッチか複数ディスパッチを行います。

関連する問題