 <p>In <em>single dispatch</em> the function executed depends on just the object type. In <em>double dispatch</em> the function executed depends on the object type and a parameter. </p> <p>In the following example, the function <code>Area()</code> is invoked using single dispatch, and <code>Intersect()</code> relies on double dispatch because it takes a Shape parameter.</p> <pre><code>class Circle; class Rectangle; class Shape { virtual double Area() = 0; // Single dispatch // ... virtual double Intersect(const Shape&amp; s) = 0; // double dispatch, take a Shape argument virtual double Intersect(const Circle&amp; s) = 0; virtual double Intersect(const Rectangle&amp; s) = 0; }; struct Circle : public Shape { virtual double Area() { return /* pi*r*r */; } virtual double Intersect(const Shape&amp; s); { return s.Intersect(*this) ; } virtual double Intersect(const Circle&amp; s); { /*circle-circle*/ } virtual double Intersect(const Rectangle&amp; s); { /*circle-rectangle*/ } }; </code></pre> <p>The example is based on this <a href="http://www.eptacom.net/pubblicazioni/pub_eng/mdisp.html" rel="nofollow noreferrer">article</a>.</p>