#include <iostream>
#include <list>
#include <string>
using namespace std;

class Animal {
public:
    virtual void speak() = 0;
    virtual ~Animal() {}; // Always a good thing if the class has virtual members
    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); // This creates a copy of d and stores it
    }
    Dog dequeueDog() {
        Dog  d = dogs.front(); // This creates a copy of the front element
        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();

    delete d; // Free your memory

    return 0;
}