#include <string>
#include <vector>
#include <iostream>

class Animal
{
 public:
  Animal(const std::string& name)
    : name(name)
  {}
  void eat()
  {
    std::cout << name << " isst" << std::endl;
  }
  std::string getName()
  {
    return name;
  }
 protected:
  std::string name;
};

class Cat : public Animal
{
 public:
  Cat(const std::string& name)
    : Animal(name)
  {
  }
  void purr()
  {
    std::cout << name << " schnurrt" << std::endl;
  }
  bool eatsOnlyCannedFood = false;  // Isst nur Nassfutter
};

class Mouse : public Animal
{
 public:
  Mouse(const std::string& name)
    : Animal(name)
  {
  }
};

void feed(const std::vector<Animal>& animals)
{
  for (Animal animal : animals)
  {
    animal.eat();
    // Hier ist es nur möglich, die Methoden der Klasse
    // Animal zu verwenden. Nicht aber zum Beispiel purr()
  }
}

int main()
{
  Cat mia("Mia");
  Cat carlo("Carlo");
  Mouse philipp("Philipp");
  std::vector<Animal> animals = { mia, carlo, philipp };
  feed(animals);
  return 0;
}
