#include <iostream>
#include <vector>
#include <memory>
class Animal
{
protected:
int tip;
std::string name;
int age;
public:
Animal(int t, std::string n, int a): tip(t), name(n), age(a) {}
virtual ~Animal() {}
virtual void print(std::ostream& os) const
{
os << "Name: " << name << std::endl;
os << "Age: " << age << std::endl;
}
friend std::ostream& operator<<(std::ostream& os, const Animal& a)
{
a.print(os);
return os;
}
};
class Cat : public Animal
{
std::string race;
std::string pref_food;
public:
Cat(int t = 0, std::string n = "", int a = 0, std::string r = "", std::string mnprf = ""):
Animal(t, n, a), race(r), pref_food(mnprf) {}
void print(std::ostream& os) const override
{
Animal::print(os);
os << "race: " << race << std::endl;
os << "Fav food: " << pref_food << std::endl;
}
};
class Dog : public Animal
{
std::string disease;
std::string master;
public:
Dog(int t = 1, std::string n = "", int a = 0, std::string b = "", std::string s = ""):
Animal(t, n, a), disease(b), master(s) {}
void print(std::ostream& os) const override
{
Animal::print(os);
os << "disease: " << disease << std::endl;
os << "master: " << master << std::endl;
}
};
template<typename T>
void add(std::vector<std::shared_ptr<Animal>> &vec, const T &a)
{
auto newptr = std::make_shared<T>(a);
vec.push_back(newptr);
}
int main()
{
std::vector<std::shared_ptr<Animal>> Animals;
Dog d(1,"Rex", 12, "idk", "Oscar");
Cat c(0,"Meaw", 11, "Sfinx", "Catfood");
add(Animals, d);
add(Animals, c);
/* alternatively:
Animals.push_back(std::make_shared<Dog>(1,"Rex", 12, "idk", "Oscar"));
Animals.push_back(std::make_shared<Cat>(0,"Meaw", 11, "Sfinx", "Catfood"));
*/
for(auto &i: Animals)
{
std::cout << *i;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5PgogICAgCmNsYXNzIEFuaW1hbAp7CnByb3RlY3RlZDoKICAgIGludCB0aXA7CiAgICBzdGQ6OnN0cmluZyBuYW1lOwogICAgaW50IGFnZTsKCnB1YmxpYzoKICAgIEFuaW1hbChpbnQgdCwgc3RkOjpzdHJpbmcgbiwgaW50IGEpOiB0aXAodCksIG5hbWUobiksIGFnZShhKSB7fQogICAgdmlydHVhbCB+QW5pbWFsKCkge30KCiAgICB2aXJ0dWFsIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtJiBvcykgY29uc3QKICAgIHsKICAgICAgICBvcyA8PCAiTmFtZTogIiA8PCBuYW1lIDw8IHN0ZDo6ZW5kbDsKICAgICAgICBvcyA8PCAiQWdlOiAiIDw8IGFnZSA8PCBzdGQ6OmVuZGw7CiAgICB9CgogICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBBbmltYWwmIGEpCiAgICB7CiAgICAgICAgYS5wcmludChvcyk7CiAgICAgICAgcmV0dXJuIG9zOwogICAgfQp9OwoKY2xhc3MgQ2F0IDogcHVibGljIEFuaW1hbAp7CiAgICBzdGQ6OnN0cmluZyByYWNlOwogICAgc3RkOjpzdHJpbmcgcHJlZl9mb29kOwoKcHVibGljOgogICAgQ2F0KGludCB0ID0gMCwgc3RkOjpzdHJpbmcgbiA9ICIiLCBpbnQgYSA9IDAsIHN0ZDo6c3RyaW5nIHIgPSAiIiwgc3RkOjpzdHJpbmcgbW5wcmYgPSAiIik6CiAgICAgICAgQW5pbWFsKHQsIG4sIGEpLCByYWNlKHIpLCBwcmVmX2Zvb2QobW5wcmYpIHt9CgogICAgdm9pZCBwcmludChzdGQ6Om9zdHJlYW0mIG9zKSBjb25zdCBvdmVycmlkZQogICAgewogICAgICAgIEFuaW1hbDo6cHJpbnQob3MpOwogICAgICAgIG9zIDw8ICJyYWNlOiAiIDw8IHJhY2UgPDwgc3RkOjplbmRsOwogICAgICAgIG9zIDw8ICJGYXYgZm9vZDogIiA8PCBwcmVmX2Zvb2QgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKY2xhc3MgRG9nIDogcHVibGljIEFuaW1hbAp7CiAgICBzdGQ6OnN0cmluZyBkaXNlYXNlOwogICAgc3RkOjpzdHJpbmcgbWFzdGVyOwoKcHVibGljOgogICAgRG9nKGludCB0ID0gMSwgc3RkOjpzdHJpbmcgbiA9ICIiLCBpbnQgYSA9IDAsIHN0ZDo6c3RyaW5nIGIgPSAiIiwgc3RkOjpzdHJpbmcgcyA9ICIiKToKICAgICAgICBBbmltYWwodCwgbiwgYSksIGRpc2Vhc2UoYiksIG1hc3RlcihzKSB7fQoKICAgIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtJiBvcykgY29uc3Qgb3ZlcnJpZGUKICAgIHsKICAgICAgICBBbmltYWw6OnByaW50KG9zKTsKICAgICAgICBvcyA8PCAiZGlzZWFzZTogIiA8PCBkaXNlYXNlIDw8IHN0ZDo6ZW5kbDsKICAgICAgICBvcyA8PCAibWFzdGVyOiAiIDw8IG1hc3RlciA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIGFkZChzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QW5pbWFsPj4gJnZlYywgY29uc3QgVCAmYSkKewogICAgYXV0byBuZXdwdHIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFQ+KGEpOwogICAgdmVjLnB1c2hfYmFjayhuZXdwdHIpOwp9CiAgICAKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QW5pbWFsPj4gQW5pbWFsczsKCiAgICBEb2cgZCgxLCJSZXgiLCAxMiwgImlkayIsICJPc2NhciIpOwogICAgQ2F0IGMoMCwiTWVhdyIsIDExLCAiU2ZpbngiLCAiQ2F0Zm9vZCIpOwogICAgYWRkKEFuaW1hbHMsIGQpOwogICAgYWRkKEFuaW1hbHMsIGMpOwoKICAgIC8qIGFsdGVybmF0aXZlbHk6CiAgICBBbmltYWxzLnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPERvZz4oMSwiUmV4IiwgMTIsICJpZGsiLCAiT3NjYXIiKSk7CiAgICBBbmltYWxzLnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPENhdD4oMCwiTWVhdyIsIDExLCAiU2ZpbngiLCAiQ2F0Zm9vZCIpKTsKICAgICovCgogICAgZm9yKGF1dG8gJmk6IEFuaW1hbHMpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICppOwogICAgfQoKICAgIHJldHVybiAwOwp9