#include <iostream>
#include <typeinfo>
using namespace std;
struct Foo { virtual Foo* c() {return this;} };
struct Bar : public Foo { Bar* c() {return this;} };
int main() {
Foo f;
Foo* fp;
Bar b;
Bar* bp;
cout << typeid(f).name() << "\n";
cout << typeid(fp).name() << "\n";
cout << typeid(b).name() << "\n";
cout << typeid(bp).name() << "\n";
cout << typeid(f.c()).name() << "\n";
cout << typeid(b.c()).name() << "\n";
fp = &f;
bp = &b;
cout << typeid(fp->c()).name() << "\n";
cout << typeid(bp->c()).name() << "\n";
fp = &b;
cout << typeid(fp->c()).name() << "\n";
cout << typeid(*fp->c()).name() << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgRm9vIHsgdmlydHVhbCBGb28qIGMoKSB7cmV0dXJuIHRoaXM7fSB9OwpzdHJ1Y3QgQmFyIDogcHVibGljIEZvbyB7IEJhciogYygpIHtyZXR1cm4gdGhpczt9IH07CgppbnQgbWFpbigpIHsKCUZvbyBmOwoJRm9vKiBmcDsKCUJhciBiOwoJQmFyKiBicDsKCQoJY291dCA8PCB0eXBlaWQoZikubmFtZSgpIDw8ICJcbiI7Cgljb3V0IDw8IHR5cGVpZChmcCkubmFtZSgpIDw8ICJcbiI7Cgljb3V0IDw8IHR5cGVpZChiKS5uYW1lKCkgPDwgIlxuIjsKCWNvdXQgPDwgdHlwZWlkKGJwKS5uYW1lKCkgPDwgIlxuIjsKCWNvdXQgPDwgdHlwZWlkKGYuYygpKS5uYW1lKCkgPDwgIlxuIjsKCWNvdXQgPDwgdHlwZWlkKGIuYygpKS5uYW1lKCkgPDwgIlxuIjsKCQoJZnAgPSAmZjsKCWJwID0gJmI7CgkKCWNvdXQgPDwgdHlwZWlkKGZwLT5jKCkpLm5hbWUoKSA8PCAiXG4iOwoJY291dCA8PCB0eXBlaWQoYnAtPmMoKSkubmFtZSgpIDw8ICJcbiI7CgkKCWZwID0gJmI7CgkKCWNvdXQgPDwgdHlwZWlkKGZwLT5jKCkpLm5hbWUoKSA8PCAiXG4iOwoJY291dCA8PCB0eXBlaWQoKmZwLT5jKCkpLm5hbWUoKSA8PCAiXG4iOwoJCglyZXR1cm4gMDsKfQ==