Double Dispatch Is More Than Function Overloading
At first glance, double dispatch appears to be a natural result of function overloading. Function overloading allows the function called to depend on the type of the argument. Function overloading however is done at compile time using "name mangling" where the internal name of the function has the argument's type encoded in it. So for example a function foo(int)
would internally be called __foo_i and function foo(double)
would be called __foo_d. So there is no runtime overhead because there is no name collision and calling an overloaded function goes through at most one virtual table just like any other function. Dynamic dispatch is only based on the type of the calling object. Consider the following example, written in C++, of collisions in a game:
If you have
Asteroid theAsteroid; SpaceShip theSpaceShip; ApolloSpacecraft theApolloSpacecraft;then, because of function overloading,
theAsteroid.CollideWith(theSpaceShip); theAsteroid.CollideWith(theApolloSpacecraft);will print Asteroid hit a SpaceShip
and Asteroid hit an ApolloSpacecraft
respectively, without using any dynamic dispatch. Furthermore
will print ExplodingAsteroid hit a SpaceShip
and ExplodingAsteroid hit an ApolloSpacecraft
respectively, again without dynamic dispatch.
With a reference to an Asteroid
, dynamic dispatch is used and
prints ExplodingAsteroid hit a SpaceShip
and ExplodingAsteroid hit an ApolloSpacecraft
, again as expected. However,
The desired behaviour is to bind these calls to the function that takes theApolloSpacecraft
as its argument, as that is the instantiated type of the variable, meaning the expected output would be Asteroid hit an ApolloSpacecraft
and ExplodingAsteroid hit an ApolloSpacecraft
, but the output is actually Asteroid hit a SpaceShip
and ExplodingAsteroid hit a SpaceShip
. The problem is that, while virtual functions are dispatched dynamically in C++, function overloading is done statically.
Read more about this topic: Double Dispatch
Famous quotes containing the words double and/or function:
“[The] elderly and timid single gentleman in Paris ... never drove down the Champs Elysees without expecting an accident, and commonly witnessing one; or found himself in the neighborhood of an official without calculating the chances of a bomb. So long as the rates of progress held good, these bombs would double in force and number every ten years.”
—Henry Brooks Adams (18381918)
“The function of muscle is to pull and not to push, except in the case of the genitals and the tongue.”
—Leonardo Da Vinci (14251519)