2010-12-02 90 views
0

他們是什麼,他們之間有什麼不同?多派遣和多方法

來源很多,像Wikipedia,聲稱他們是同樣的事情,但也有人明確表示,相反,像SBIthis question

第一:「訪問者模式是一種方法來模擬雙調度在C++中「。這是,呃,不完全正確。實際上,雙派遣是多派遣的一種形式,這是一種在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; 
} 

運行時,上面的程序打印123,而不是3.到目前爲止好。

多次調度是語言或運行時在「this」指針的類型和方法參數的類型上分派的能力。考慮(與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; 
} 

如果C++有多重調度,程序將打印「稱爲派生::美孚與Dervied *」。 (可惜的是,C++沒有多次調度,所以程序打印出「被調用的Derived :: Foo with a Base *」。)

Double-dispatch是多派遣的一個特例,通常更容易模擬,但作爲一種語言功能並不十分常見。大多數語言都是單發或多發。