/// @file   main.cpp
/// @author Jens Gruschel
/// @date   2016-07-14
/// Vererbung und Polymorphismus

#include <iostream>

using std::cout;
using std::endl;

/// Basisklasse bzw. Interface fuer Tiere
class Animal
{
public:
    virtual ~Animal() {}
    virtual void talk() = 0;
};

/// ein Hund ist ein Tier
class Dog : public Animal
{
public:
    void talk() override;
};

void Dog::talk()
{
    cout << "wuff" << endl;
}

/// eine Katze ist ein Tier
class Cat : public Animal
{
public:
    void talk() override;
};

void Cat::talk()
{
    cout << "miau" << endl;
}

/// und eine Ente ist auch ein Tier
class Duck : public Animal
{
public:
    void talk() override;
};

void Duck::talk()
{
    cout << "quack" << endl;
}

/// Funktion, die Tier verwendet
/// (ohne zu wissen welches)
void playWith(Animal& animal)
{
    cout << "dieses Tier macht... ";
    animal.talk();
}

int main()
{
    Dog dog;
    playWith(dog);

    Cat cat;
    playWith(cat);

    Duck duck;
    playWith(duck);

    return 0;
}