他們是什麼,他們之間有什麼不同?多派遣和多方法
來源很多,像Wikipedia,聲稱他們是同樣的事情,但也有人明確表示,相反,像SBI在this question:
第一:「訪問者模式是一種方法來模擬雙調度在C++中「。這是,呃,不完全正確。實際上,雙派遣是多派遣的一種形式,這是一種在C++中模擬(缺少)多派的方法。
他們是什麼,他們之間有什麼不同?多派遣和多方法
來源很多,像Wikipedia,聲稱他們是同樣的事情,但也有人明確表示,相反,像SBI在this question:
第一:「訪問者模式是一種方法來模擬雙調度在C++中「。這是,呃,不完全正確。實際上,雙派遣是多派遣的一種形式,這是一種在C++中模擬(缺少)多派的方法。
它們是相同的。
當您在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是多派遣的一個特例,通常更容易模擬,但作爲一種語言功能並不十分常見。大多數語言都是單發或多發。