#include <iostream>
#include <list>
using namespace std;
class Animal {
public:
virtual void speak() = 0;
string name;
};
class Dog: public Animal {
public:
Dog(string n) { this->name=n; }
void speak() { cout<<this->name<<" says WOOF!"<<endl; }
};
class AnimalQueue {
list<Dog> dogs;
public:
void enqueue(Animal* a) {
Dog * d = dynamic_cast<Dog*>(a);
dogs.push_back(*d);
}
Dog* dequeueDog() {
Dog * d = &(dogs.front());
dogs.pop_front();
return d;
}
};
int main() {
// Set up
AnimalQueue q;
Dog * d;
d = new Dog("Rex");
q.enqueue(d);
// Try with dog-specific command
d = q.dequeueDog();
cout<<d->name<<endl;// Prints "Rex"
d->speak(); // Crashes?!
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEFuaW1hbCB7CnB1YmxpYzoKCXZpcnR1YWwgdm9pZCBzcGVhaygpID0gMDsKCXN0cmluZyBuYW1lOwp9OwoKY2xhc3MgRG9nOiBwdWJsaWMgQW5pbWFsIHsKcHVibGljOgoJRG9nKHN0cmluZyBuKSB7IHRoaXMtPm5hbWU9bjsgfQoJdm9pZCBzcGVhaygpIHsgY291dDw8dGhpcy0+bmFtZTw8IiBzYXlzIFdPT0YhIjw8ZW5kbDsgfQp9OwoKY2xhc3MgQW5pbWFsUXVldWUgewoJbGlzdDxEb2c+IGRvZ3M7CnB1YmxpYzoKCXZvaWQgZW5xdWV1ZShBbmltYWwqIGEpIHsKCQlEb2cgKiBkID0gZHluYW1pY19jYXN0PERvZyo+KGEpOwoJCWRvZ3MucHVzaF9iYWNrKCpkKTsKCX0KCURvZyogZGVxdWV1ZURvZygpIHsKCQlEb2cgKiBkID0gJihkb2dzLmZyb250KCkpOwoJCWRvZ3MucG9wX2Zyb250KCk7CgkJcmV0dXJuIGQ7Cgl9Cn07CgppbnQgbWFpbigpIHsKCS8vIFNldCB1cAoJQW5pbWFsUXVldWUgcTsKCURvZyAqIGQ7CglkID0gbmV3IERvZygiUmV4Iik7CglxLmVucXVldWUoZCk7CgkKCS8vIFRyeSB3aXRoIGRvZy1zcGVjaWZpYyBjb21tYW5kCglkID0gcS5kZXF1ZXVlRG9nKCk7Cgljb3V0PDxkLT5uYW1lPDxlbmRsOy8vIFByaW50cyAiUmV4IgoJZC0+c3BlYWsoKTsJCQkvLyBDcmFzaGVzPyEKCQoJcmV0dXJuIDA7Cn0=