#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;
}