#include <iostream>
#include <string>
#include <typeinfo>
struct A
{
virtual ~A() {}
std::string GetFunnyName() {return typeid(*this).name();}
};
struct B: A {};
struct C: A {};
int main()
{
A* o1 = new A;
A* o2 = new B;
A* o3 = new C;
std::cout << o1->GetFunnyName() << '\n';
std::cout << o2->GetFunnyName() << '\n';
std::cout << o3->GetFunnyName() << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHlwZWluZm8+CgpzdHJ1Y3QgQQp7Cgl2aXJ0dWFsIH5BKCkge30KCXN0ZDo6c3RyaW5nIEdldEZ1bm55TmFtZSgpIHtyZXR1cm4gdHlwZWlkKCp0aGlzKS5uYW1lKCk7fQp9OwoKc3RydWN0IEI6IEEge307CnN0cnVjdCBDOiBBIHt9OwoKaW50IG1haW4oKQp7CglBKiBvMSA9IG5ldyBBOwoJQSogbzIgPSBuZXcgQjsKCUEqIG8zID0gbmV3IEM7CglzdGQ6OmNvdXQgPDwgbzEtPkdldEZ1bm55TmFtZSgpIDw8ICdcbic7CglzdGQ6OmNvdXQgPDwgbzItPkdldEZ1bm55TmFtZSgpIDw8ICdcbic7CglzdGQ6OmNvdXQgPDwgbzMtPkdldEZ1bm55TmFtZSgpIDw8ICdcbic7Cn0K