 #include <iostream>
    #include <list>
    
    struct Animal {
        virtual void say() {
            std::cout <<"I'm generic animal\n";
        }

        virtual ~Animal(){}
    };
    
    struct Cat : public Animal {
        virtual void say() {
            std::cout << "Meow\n";
        }
        virtual ~Cat(){}
    };
    
    int main() {
        std::list<Animal*> l;
        l.push_back(new Animal);
        l.push_back(new Cat);
        for(Animal* ptr: l) {
            ptr->say();
        }
        for(Animal* ptr: l) {
            delete ptr; //not needed if you use smart pointers.
        }
    }