#include <iostream>
#include <memory>
#include <list>

using namespace std;

class Zvire
{
public:
    virtual void UdelejZvuk() = 0;
};

class Axolotl : public Zvire {
public:
    virtual void UdelejZvuk() {
        cout << "blblbl..." << endl;
    }
};

class Lion : public Zvire {
public:
    virtual void UdelejZvuk() {
        cout << "ROAAAAR..." << endl;
    }
};

class Krabice : public Zvire {
public:
    virtual void UdelejZvuk() {
        for (auto & z : zvirata)
        {
            z->UdelejZvuk();
        }
    }
private:
    std::list<std::unique_ptr<Zvire> > zvirata;
public:
    void PridajZvire(std::unique_ptr<Zvire> && zvire) {
        zvirata.push_back(std::move(zvire));
    }
};

int main()
{
    std::list<std::unique_ptr<Zvire> > zvirata;

    zvirata.push_back(std::unique_ptr<Zvire>(new Axolotl()));
    zvirata.push_back(std::unique_ptr<Zvire>(new Lion()));


    zvirata.push_back(std::unique_ptr<Zvire>(new Krabice()));
    zvirata.back()->PridajZvire(std::unique_ptr<Zvire>(new Axolotl()));
    zvirata.back()->PridajZvire(std::unique_ptr<Zvire>(new Axolotl()));

    for (auto & z : zvirata)
    {
        z->UdelejZvuk();
    }
   
    return 0;
}
