2010-12-02 3 views
0

무엇이며, 무엇이 다른가요?다중 발송 및 다중 방법

많은 소스는 Wikipedia처럼 제 그들은 같은 일,하지만 다른 사람은 명시 적으로 this questionSBI처럼, 반대 말 :

첫째 : "방문자 패턴이 두 번 파견을 시뮬레이션 할 수있는 방법입니다 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++ 구문을 고수) 고려 : 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 *와 파생 :: 푸 호출"인쇄 것입니다. (슬프게도, C++에는 다중 발송이 없기 때문에 "Called Derived :: Foo with Base *"가 출력됩니다.)

이중 발송은 여러 번 발송하는 특수한 경우로, ,하지만 언어 기능으로 대단히 일반적이지는 않습니다. 대부분의 언어는 단일 발송 또는 다중 발송을 수행합니다.