S
saneman
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?
#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?