saneman wrote: > I am trying to use double dispatch in the below code: > > #include <iostream> > > class Box; > class Sphere; > > > class geometry_type > { > public: > virtual void haps(geometry_type* other)=0; > virtual void collideWith(Box* other)=0; > virtual void collideWith(Sphere* other) = 0; > }; > > class Box : public geometry_type > { > public : > Box() {} > > virtual void haps(geometry_type* other) > { > other->collideWith(this); > } > > virtual void collideWith(Sphere* other) { > std::cout << "Sphere collision with Sphere" << std::endl; > } > > virtual void collideWith(Box* other) { > std::cout << "Box collision with Box" << std::endl; > } > > > }; > > class Sphere : public geometry_type > { > public : > Sphere() {} > > virtual void haps(geometry_type* other) > { > other->collideWith(this); > } > > virtual void collideWith(Sphere* other) { > std::cout << "Sphere collision with Sphere" << std::endl; > } > > virtual void collideWith(Box* other) { > std::cout << "Sphere collision with Box" << std::endl; > } > > > }; > > > void narrow_phase(geometry_type* G1, geometry_type* G2) > { > G1->haps(G2); > } > > int main() > { > Box* BoxA = new Box(); > Sphere* SphereA = new Sphere(); > > BoxA->collideWith(BoxA); > SphereA->collideWith(BoxA); > > // Should print box collide with box. > narrow_phase(BoxA, BoxA); > > // Should print sphere collide with box. > narrow_phase(SphereA, BoxA); > > // Should print box collide with sphere. > narrow_phase(BoxA, SphereA); > > return 0; > > } > > > But when I run main I get: > > Box collision with Box > Sphere collision with Box > Box collision with Box > Sphere collision with Sphere > Sphere collision with Box > > > What goes on in the last two calls? Because your Box::collideWith(Sphere*) has a bug in it. Has nothing to do with your double dispatch, which appears to be working perfectly. -- Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>