topical media & game development
professional-program-25-DoubleDispatch-DoubleDispatch.c
? /
professional-program-25-DoubleDispatch-DoubleDispatch.c
include <iostream>
using namespace std;
// forward references
class Fish;
class Bear;
class Dinosaur;
class Animal
{
public:
virtual bool eats(const Animal& inPrey) const = 0;
virtual bool eatenBy(const Bear& inBear) const = 0;
virtual bool eatenBy(const Fish& inFish) const = 0;
virtual bool eatenBy(const Dinosaur& inDinosaur) const = 0;
};
class Bear : public Animal
{
public:
virtual bool eats(const Animal& inPrey) const;
virtual bool eatenBy(const Bear& inBear) const;
virtual bool eatenBy(const Fish& inFish) const;
virtual bool eatenBy(const Dinosaur& inDinosaur) const;
};
class Fish : public Animal
{
public:
virtual bool eats(const Animal& inPrey) const;
virtual bool eatenBy(const Bear& inBear) const;
virtual bool eatenBy(const Fish& inFish) const;
virtual bool eatenBy(const Dinosaur& inDinosaur) const;
};
class Dinosaur : public Animal
{
public:
virtual bool eats(const Animal& inPrey) const;
virtual bool eatenBy(const Bear& inBear) const;
virtual bool eatenBy(const Fish& inFish) const;
virtual bool eatenBy(const Dinosaur& inDinosaur) const;
};
bool Bear::eats(const Animal& inPrey) const
{
return inPrey.eatenBy(*this);
}
bool Bear::eatenBy(const Bear& inBear) const
{
return false;
}
bool Bear::eatenBy(const Fish& inFish) const
{
return false;
}
bool Bear::eatenBy(const Dinosaur& inDinosaur) const
{
return true;
}
bool Fish::eats(const Animal& inPrey) const
{
return inPrey.eatenBy(*this);
}
bool Fish::eatenBy(const Bear& inBear) const
{
return true;
}
bool Fish::eatenBy(const Fish& inFish) const
{
return true;
}
bool Fish::eatenBy(const Dinosaur& inDinosaur) const
{
return true;
}
bool Dinosaur::eats(const Animal& inPrey) const
{
return inPrey.eatenBy(*this);
}
bool Dinosaur::eatenBy(const Bear& inBear) const
{
return false;
}
bool Dinosaur::eatenBy(const Fish& inFish) const
{
return false;
}
bool Dinosaur::eatenBy(const Dinosaur& inDinosaur) const
{
return true;
}
int main(int argc, char** argv)
{
Fish myFish;
Bear myBear;
Dinosaur myDino;
cout << "Fish eats bear? " << myFish.eats(myBear) << endl;
cout << "Fish eats dino? " << myFish.eats(myDino) << endl;
cout << "Dino eats bear? " << myDino.eats(myBear) << endl;
cout << "Bear eats fish? " << myBear.eats(myFish) << endl;
}
(C) Æliens
20/2/2008
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.