#include <cstdlib>
#include <typeinfo>
#include <ctime>
#include <iostream>
#include <list>
class Animal
{
public:
virtual ~Animal() = 0 ;
};
Animal::~Animal() {}
class Cat : public Animal
{
};
class Dog : public Animal
{
};
typedef std::list<Animal*> list_type;
void displayTypes(list_type::iterator beg, list_type::iterator end)
{
while (beg != end)
{
Animal* value = *beg++;
if (typeid(*value) == typeid(Cat))
std::cout << "Cat";
else if (typeid(*value) == typeid(Dog))
std::cout << "Dog";
else if (typeid(*value) == typeid(Animal))
std::cout << "Animal"; // This should never happen!
else
std::cout << "Unknown";
std::cout << '\n';
}
}
int main()
{
std::srand(std::time(0));
list_type list;
for (unsigned i = 0; i < 10; ++i)
list.push_back((rand() % 2 ? (Animal*)new Cat : (Animal*)new Dog));
displayTypes(std::begin(list), std::end(list));
while (!list.empty())
{
delete list.back();
list.pop_back();
}
}
I2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDx0eXBlaW5mbz4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxsaXN0PgoKY2xhc3MgQW5pbWFsCnsKcHVibGljOgogICAgdmlydHVhbCB+QW5pbWFsKCkgPSAwIDsKfTsKCkFuaW1hbDo6fkFuaW1hbCgpIHt9CgpjbGFzcyBDYXQgOiBwdWJsaWMgQW5pbWFsCnsKfTsKCmNsYXNzIERvZyA6IHB1YmxpYyBBbmltYWwKewp9OwoKdHlwZWRlZiBzdGQ6Omxpc3Q8QW5pbWFsKj4gbGlzdF90eXBlOwoKdm9pZCBkaXNwbGF5VHlwZXMobGlzdF90eXBlOjppdGVyYXRvciBiZWcsIGxpc3RfdHlwZTo6aXRlcmF0b3IgZW5kKQp7CiAgICB3aGlsZSAoYmVnICE9IGVuZCkKICAgIHsKICAgICAgICBBbmltYWwqIHZhbHVlID0gKmJlZysrOwoKICAgICAgICBpZiAodHlwZWlkKCp2YWx1ZSkgPT0gdHlwZWlkKENhdCkpCiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiQ2F0IjsKICAgICAgICBlbHNlIGlmICh0eXBlaWQoKnZhbHVlKSA9PSB0eXBlaWQoRG9nKSkKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJEb2ciOwogICAgICAgIGVsc2UgaWYgKHR5cGVpZCgqdmFsdWUpID09IHR5cGVpZChBbmltYWwpKQogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkFuaW1hbCI7ICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKICAgICAgICBlbHNlCiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiVW5rbm93biI7CgogICAgICAgIHN0ZDo6Y291dCA8PCAnXG4nOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6c3JhbmQoc3RkOjp0aW1lKDApKTsKCiAgICBsaXN0X3R5cGUgbGlzdDsKCiAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgMTA7ICsraSkKICAgICAgICBsaXN0LnB1c2hfYmFjaygocmFuZCgpICUgMiA/IChBbmltYWwqKW5ldyBDYXQgOiAoQW5pbWFsKiluZXcgRG9nKSk7CgogICAgZGlzcGxheVR5cGVzKHN0ZDo6YmVnaW4obGlzdCksIHN0ZDo6ZW5kKGxpc3QpKTsKCiAgICB3aGlsZSAoIWxpc3QuZW1wdHkoKSkKICAgIHsKICAgICAgICBkZWxldGUgbGlzdC5iYWNrKCk7CiAgICAgICAgbGlzdC5wb3BfYmFjaygpOwogICAgfQp9