#include <iostream>
#include<bits/stdc++.h>
using namespace std;
class Animal{
public:
string mName;
Animal(string pName){
mName=pName;
}
virtual void printAnimal(){
cout<<"Animal "<<this->mName<<endl;
}
};
class Dog: public Animal{
public:
Dog(string pName): Animal(pName){}
virtual void printAnimal() override{
cout<<"Dog "<<this->mName<<endl;
}
~Dog(){
cout<<"Dog "<<this->mName<< " removed." <<endl;
}
};
class Cat: public Animal{
public:
Cat(string pName): Animal(pName){}
void printAnimal(){
cout<<"Cat "<<this->mName<<endl;
}
~Cat(){
cout<<"Cat "<<this->mName<< " removed." <<endl;
}
};
shared_ptr<Animal> getCat(){
return make_shared<Cat>("Tom");
}
shared_ptr<Animal> getDog(){
return make_shared<Dog>("Scooby");
}
int main(){
getCat()->printAnimal();
getDog()->printAnimal();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEFuaW1hbHsKICAgIHB1YmxpYzoKICAgIHN0cmluZyBtTmFtZTsKCiAgICBBbmltYWwoc3RyaW5nIHBOYW1lKXsKICAgICAgICBtTmFtZT1wTmFtZTsKICAgIH0KCiAgICB2aXJ0dWFsIHZvaWQgcHJpbnRBbmltYWwoKXsKICAgICAgICBjb3V0PDwiQW5pbWFsICI8PHRoaXMtPm1OYW1lPDxlbmRsOwogICAgfQoKfTsKCmNsYXNzIERvZzogcHVibGljIEFuaW1hbHsKCiAgICBwdWJsaWM6IAogICAgRG9nKHN0cmluZyBwTmFtZSk6IEFuaW1hbChwTmFtZSl7fQoKICAgIHZpcnR1YWwgdm9pZCBwcmludEFuaW1hbCgpIG92ZXJyaWRlewogICAgICAgIGNvdXQ8PCJEb2cgIjw8dGhpcy0+bU5hbWU8PGVuZGw7CiAgICB9CiAgICB+RG9nKCl7CiAgICAJY291dDw8IkRvZyAiPDx0aGlzLT5tTmFtZTw8ICIgcmVtb3ZlZC4iIDw8ZW5kbDsKICAgIH0KfTsKCmNsYXNzIENhdDogcHVibGljIEFuaW1hbHsKICAgIHB1YmxpYzoKCiAgICBDYXQoc3RyaW5nIHBOYW1lKTogQW5pbWFsKHBOYW1lKXt9CgoKICAgIHZvaWQgcHJpbnRBbmltYWwoKXsKICAgICAgICBjb3V0PDwiQ2F0ICI8PHRoaXMtPm1OYW1lPDxlbmRsOwogICAgfQogICAgfkNhdCgpewogICAgCWNvdXQ8PCJDYXQgIjw8dGhpcy0+bU5hbWU8PCAiIHJlbW92ZWQuIiA8PGVuZGw7CiAgICB9Cn07CgpzaGFyZWRfcHRyPEFuaW1hbD4gZ2V0Q2F0KCl7CiAgICByZXR1cm4gbWFrZV9zaGFyZWQ8Q2F0PigiVG9tIik7Cn0KCnNoYXJlZF9wdHI8QW5pbWFsPiBnZXREb2coKXsKICAgIHJldHVybiBtYWtlX3NoYXJlZDxEb2c+KCJTY29vYnkiKTsKfQoKaW50IG1haW4oKXsKICAgIGdldENhdCgpLT5wcmludEFuaW1hbCgpOwogICAgZ2V0RG9nKCktPnByaW50QW5pbWFsKCk7Cn0=