#include <iostream>
#include <vector>
#include <memory>

class Animal
{
 public:
  virtual void eat()
  {
    std::cout << "Tier isst" << std::endl;
  }
};

class Cat : public Animal
{
 public:
  void eat() override
  {
    std::cout << "Katze isst eine Maus" << std::endl;
  }
};

class Mouse : public Animal
{
 public:
  void eat() override
  {
    std::cout << "Maus isst K\204se" << std::endl;
  }
};

class Worm : public Animal
{
};

int main()
{
  std::vector<std::shared_ptr<Animal>> zoo = {
    std::make_shared<Cat>(),
    std::make_shared<Mouse>(),
    std::make_shared<Worm>()
  };
  for (std::shared_ptr<Animal> animal : zoo)
  {
    animal->eat();
  }
  return 0;
}
