#include <iostream>
#include <exception>
#include <vector>

using namespace std;

class Zvire {
public:
	virtual ~Zvire() {};
	virtual float hmotnost() const = 0;
	virtual string zvuk() const = 0;
};

class Kocka : public Zvire {
public:
	float hmotnost() const override {
		return 15;
	}
	string zvuk() const override {
		return "mnau";
	}
};

class Pes : public Zvire {
public:
	float hmotnost() const override {
		return 15;
	}
	string zvuk() const override {
		return "haf";
	}
};

class Ptacek : public Zvire {
public:
	float hmotnost() const override {
		return 1;
	}
	string zvuk() const override {
		return "kra";
	}
};

class Ohrada
{
public:
	~Ohrada() {
		for (auto animal : zvirata) {
			delete animal;
		}
	}
	vector<Zvire*> zvirata;
	template<typename Druh>
	size_t PocetZvirat() const
	{
		size_t n = 0;
		for (const auto z : zvirata)
			if (dynamic_cast<Druh*>(z) != nullptr)++n;

		return n;
	}
};





int main() {
	try {
		Ohrada o;
		o.zvirata.push_back(new Ptacek());
		o.zvirata.push_back(new Pes());
		o.zvirata.push_back(new Ptacek());
		o.zvirata.push_back(new Kocka());

		for (const auto z : o.zvirata) {
			cout << z->zvuk().c_str() << endl;
		}

		cout << o.PocetZvirat<Ptacek>() << endl;
	}
	catch (exception& e) {
		cerr << e.what() << endl;
		return 1;
	}
}
