#include <iostream>
#include <vector>
#include <typeinfo>
struct Shape
{
virtual ~Shape(){} // at least one virtual function needed for polymorphism
};
struct Circle: Shape
{
};
struct Square: Shape
{
};
int main()
{
std::vector<Shape *> vec;
vec.push_back(new Square());
vec.push_back(new Circle());
std::vector<Shape *>::iterator tmp = vec.begin();
for(;tmp != vec.end(); ++tmp)
{
if(typeid(**tmp).name() == typeid(Square).name())
{
std::cout << "Square" << std::endl;;
}
else if(typeid(**tmp).name() == typeid(Circle).name())
{
std::cout << "Circle" << std::endl;;
}
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dHlwZWluZm8+CgpzdHJ1Y3QgU2hhcGUKewogICAgdmlydHVhbCB+U2hhcGUoKXt9IC8vIGF0IGxlYXN0IG9uZSB2aXJ0dWFsIGZ1bmN0aW9uIG5lZWRlZCBmb3IgcG9seW1vcnBoaXNtCn07CgpzdHJ1Y3QgQ2lyY2xlOiBTaGFwZQp7Cgp9OwpzdHJ1Y3QgU3F1YXJlOiBTaGFwZQp7Cgp9OwoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxTaGFwZSAqPiB2ZWM7CiAgICB2ZWMucHVzaF9iYWNrKG5ldyBTcXVhcmUoKSk7CiAgICB2ZWMucHVzaF9iYWNrKG5ldyBDaXJjbGUoKSk7CiAgICBzdGQ6OnZlY3RvcjxTaGFwZSAqPjo6aXRlcmF0b3IgdG1wID0gdmVjLmJlZ2luKCk7CgogICAgICAgIGZvcig7dG1wICE9IHZlYy5lbmQoKTsgKyt0bXApCiAgICAgICAgewogICAgICAgICAgICBpZih0eXBlaWQoKip0bXApLm5hbWUoKSA9PSB0eXBlaWQoU3F1YXJlKS5uYW1lKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiU3F1YXJlIiA8PCBzdGQ6OmVuZGw7OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodHlwZWlkKCoqdG1wKS5uYW1lKCkgPT0gdHlwZWlkKENpcmNsZSkubmFtZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkNpcmNsZSIgPDwgc3RkOjplbmRsOzsKICAgICAgICAgICAgfQogICAgICAgIH0KCgp9Cg==