doubledispatch.cpp
来自「C++高级编程这本书所附的源代码」· C++ 代码 · 共 124 行
CPP
124 行
#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;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?