#include <list>
#include <memory>
#include <iostream>

struct Base
{
   virtual void foo() = 0;
};

struct Derived1 : Base
{
   void foo() { std::cout << "Lol!\n"; }
};

struct Derived2 : Base
{
   void foo() { std::cout << "Haha!\n"; }
};

int main()
{
   typedef std::list<std::unique_ptr<Base>> list_type;
   
   list_type l;
   l.push_back(list_type::value_type(new Derived1()));
   l.push_back(list_type::value_type(new Derived2()));
   l.push_back(list_type::value_type(new Derived2()));
   l.push_back(list_type::value_type(new Derived1()));
   
   for (auto& x : l)
      x->foo();
}