⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 doubledispatch.cpp

📁 C++高级编程这本书所附的源代码
💻 CPP
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -