#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHN0cmluZz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEFuaW1hbCB7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBzcGVhaygpID0gMDsKICAgIHZpcnR1YWwgfkFuaW1hbCgpIHt9OyAvLyBBbHdheXMgYSBnb29kIHRoaW5nIGlmIHRoZSBjbGFzcyBoYXMgdmlydHVhbCBtZW1iZXJzCiAgICBzdHJpbmcgbmFtZTsKfTsKCmNsYXNzIERvZyA6IHB1YmxpYyBBbmltYWwgewpwdWJsaWM6CiAgICBEb2coc3RyaW5nIG4pIHsgdGhpcy0+bmFtZSA9IG47IH0KICAgIHZvaWQgc3BlYWsoKSB7IGNvdXQgPDwgdGhpcy0+bmFtZSA8PCAiIHNheXMgV09PRiEiIDw8IGVuZGw7IH0gICAgCn07CgpjbGFzcyBBbmltYWxRdWV1ZSB7CiAgICBsaXN0PERvZz4gZG9nczsKcHVibGljOgogICAgdm9pZCBlbnF1ZXVlKEFuaW1hbCogYSkgewogICAgICAgIERvZyAqIGQgPSBkeW5hbWljX2Nhc3Q8RG9nKj4oYSk7CiAgICAgICAgZG9ncy5wdXNoX2JhY2soKmQpOyAvLyBUaGlzIGNyZWF0ZXMgYSBjb3B5IG9mIGQgYW5kIHN0b3JlcyBpdAogICAgfQogICAgRG9nIGRlcXVldWVEb2coKSB7CiAgICAgICAgRG9nICBkID0gZG9ncy5mcm9udCgpOyAvLyBUaGlzIGNyZWF0ZXMgYSBjb3B5IG9mIHRoZSBmcm9udCBlbGVtZW50CiAgICAgICAgZG9ncy5wb3BfZnJvbnQoKTsKICAgICAgICByZXR1cm4gZDsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgLy8gU2V0IHVwCiAgICBBbmltYWxRdWV1ZSBxOwogICAgRG9nICogZDsKICAgIGQgPSBuZXcgRG9nKCJSZXgiKTsKICAgIHEuZW5xdWV1ZShkKTsKCiAgICAvLyBUcnkgd2l0aCBkb2ctc3BlY2lmaWMgY29tbWFuZAogICAgKmQgPSBxLmRlcXVldWVEb2coKTsKICAgIGNvdXQgPDwgZC0+bmFtZSA8PCBlbmRsOy8vIFByaW50cyAiUmV4IgogICAgZC0+c3BlYWsoKTsKCiAgICBkZWxldGUgZDsgLy8gRnJlZSB5b3VyIG1lbW9yeQoKICAgIHJldHVybiAwOwp9