#include <iostream>
#include <vector>
#include <memory>
struct foo {
virtual void print() =0;
};
struct goo : public foo {
int a;
void print() { std::cout << "goo"; }
};
struct moo : public foo {
int a,b;
void print() { std::cout << "moo"; }
};
typedef std::unique_ptr<foo> foo_ptr;
int main() {
std::vector<std::unique_ptr<foo> > foos;
foos.push_back(foo_ptr(new moo));
foos.push_back(foo_ptr(new goo));
foos.push_back(foo_ptr(new goo));
foos.push_back(foo_ptr(new moo));
for(auto it = foos.begin(); it!=foos.end(); ++it) {
it->get()->print();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IGZvbyB7Cgl2aXJ0dWFsIHZvaWQgcHJpbnQoKSA9MDsKfTsKCnN0cnVjdCBnb28gOiBwdWJsaWMgZm9vIHsKCWludCBhOwoJdm9pZCBwcmludCgpIHsgc3RkOjpjb3V0IDw8ICJnb28iOyB9Cn07CgpzdHJ1Y3QgbW9vIDogcHVibGljIGZvbyB7CglpbnQgYSxiOwoJdm9pZCBwcmludCgpIHsgc3RkOjpjb3V0IDw8ICJtb28iOyB9Cn07CnR5cGVkZWYgc3RkOjp1bmlxdWVfcHRyPGZvbz4gZm9vX3B0cjsKaW50IG1haW4oKSB7CglzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Zm9vPiA+IGZvb3M7Cglmb29zLnB1c2hfYmFjayhmb29fcHRyKG5ldyBtb28pKTsKCWZvb3MucHVzaF9iYWNrKGZvb19wdHIobmV3IGdvbykpOwoJZm9vcy5wdXNoX2JhY2soZm9vX3B0cihuZXcgZ29vKSk7Cglmb29zLnB1c2hfYmFjayhmb29fcHRyKG5ldyBtb28pKTsKCQoJZm9yKGF1dG8gaXQgPSBmb29zLmJlZ2luKCk7IGl0IT1mb29zLmVuZCgpOyArK2l0KSB7CgkJaXQtPmdldCgpLT5wcmludCgpOwoJfQoJcmV0dXJuIDA7Cn0=