디스패치(Dispatch)디스패치는 주어진 정보 하에서 호출한 함수를 어떻게 특정하는가?
일을 처리할 담당자를 찾아서 일을 전달하는 작업
struct Stuff {};
struct Foo: Stuff {};
struct Bar: Stuff {};
void func(Foo* foo) {}
void func(Bar* bar) {}
Foo* foo=new Foo;
func(foo);
Bar* bar=new Bar;
func(bar);
위와 같이 오버로드된 함수에 Foo 객체 or Bar 객체를 인자로 넘기면, 그에 맞는
함수를 호출한다.
하지만 아래와 같이 Foo를 상위 클래스인 Stuff로 업캐스팅하여 func()로 전달하면,
컴파일러가 오버로딩할 함수를 선택할 수 없다.
Stuff* stuff=new Foo;
func(stuff);
런타임에 명시적으로 타입 체크를 하지 않고도 올바르게 오버로딩할 수 있는 방법
Stuff에 대해서 어떤 함수를 호출할 때, 함수는 다형성을 가질 수 있고(C++ 클래스의 vtable 덕분)
필요한 컴포넌트로 디스패치될 수 있다.
(이중 디스패치)
1. 실제 객체에 다형성 호출을 한다.
2. 다형성 호출이 수행되는 객체 안에서는 오버로딩을 일으킬 수 있다.
(this가 특정 타입(Foo* 또는 Bar*와 같은 타입)을 가지기 때문)
struct Stuff{
virtual void call()=0;
};
struct Foo: Stuff{
void call() override {
func(this);
}
};
struct Bar: Stuff{
void call() override {
func(this);
}
};
void func(Foo* foo) {}
void func(Bar* bar) {}
Stuff* stuff=new Foo;
stuff->call();