#include <iostream>
#include <string>

using namespace std;

class Animal
{
public:
    string m_name {};

    Animal(string name): m_name{ name } {}

    const string& getName() const { return m_name; }
    string speak() const { return "???"; } // dodajemy virtual
};

class Cat: public Animal
{
public:
    Cat(string name): Animal{ name } {}

    string speak() const { return "Miauu"; }  // możemy, nie musimy, dodać virtual
};

class Dog: public Animal
{
public:
    Dog(string name): Animal{ name } {}

    string speak() const { return "Hauu"; }  // możemy, nie musimy, dodać virtual
};

void report(const Animal& animal)
{
    cout << animal.getName() << " mowi: " << animal.speak() << '\n';
}

int main()
{
    Cat cat{ "Fred" };
    Dog dog{ "Garbo" };

    report(cat);
    report(dog);

    return 0;
}
