#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.
}
}
ICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDxsaXN0PgogICAgCiAgICBzdHJ1Y3QgQW5pbWFsIHsKICAgICAgICB2aXJ0dWFsIHZvaWQgc2F5KCkgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwiSSdtIGdlbmVyaWMgYW5pbWFsXG4iOwogICAgICAgIH0KCiAgICAgICAgdmlydHVhbCB+QW5pbWFsKCl7fQogICAgfTsKICAgIAogICAgc3RydWN0IENhdCA6IHB1YmxpYyBBbmltYWwgewogICAgICAgIHZpcnR1YWwgdm9pZCBzYXkoKSB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWVvd1xuIjsKICAgICAgICB9CiAgICAgICAgdmlydHVhbCB+Q2F0KCl7fQogICAgfTsKICAgIAogICAgaW50IG1haW4oKSB7CiAgICAgICAgc3RkOjpsaXN0PEFuaW1hbCo+IGw7CiAgICAgICAgbC5wdXNoX2JhY2sobmV3IEFuaW1hbCk7CiAgICAgICAgbC5wdXNoX2JhY2sobmV3IENhdCk7CiAgICAgICAgZm9yKEFuaW1hbCogcHRyOiBsKSB7CiAgICAgICAgICAgIHB0ci0+c2F5KCk7CiAgICAgICAgfQogICAgICAgIGZvcihBbmltYWwqIHB0cjogbCkgewogICAgICAgICAgICBkZWxldGUgcHRyOyAvL25vdCBuZWVkZWQgaWYgeW91IHVzZSBzbWFydCBwb2ludGVycy4KICAgICAgICB9CiAgICB9