#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();
}