#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();
}
I2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnN0cnVjdCBCYXNlCnsKICAgdmlydHVhbCB2b2lkIGZvbygpID0gMDsKfTsKCnN0cnVjdCBEZXJpdmVkMSA6IEJhc2UKewogICB2b2lkIGZvbygpIHsgc3RkOjpjb3V0IDw8ICJMb2whXG4iOyB9Cn07CgpzdHJ1Y3QgRGVyaXZlZDIgOiBCYXNlCnsKICAgdm9pZCBmb28oKSB7IHN0ZDo6Y291dCA8PCAiSGFoYSFcbiI7IH0KfTsKCmludCBtYWluKCkKewogICB0eXBlZGVmIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QmFzZT4+IGxpc3RfdHlwZTsKICAgCiAgIGxpc3RfdHlwZSBsOwogICBsLnB1c2hfYmFjayhsaXN0X3R5cGU6OnZhbHVlX3R5cGUobmV3IERlcml2ZWQxKCkpKTsKICAgbC5wdXNoX2JhY2sobGlzdF90eXBlOjp2YWx1ZV90eXBlKG5ldyBEZXJpdmVkMigpKSk7CiAgIGwucHVzaF9iYWNrKGxpc3RfdHlwZTo6dmFsdWVfdHlwZShuZXcgRGVyaXZlZDIoKSkpOwogICBsLnB1c2hfYmFjayhsaXN0X3R5cGU6OnZhbHVlX3R5cGUobmV3IERlcml2ZWQxKCkpKTsKICAgCiAgIGZvciAoYXV0byYgeCA6IGwpCiAgICAgIHgtPmZvbygpOwp9