#include <iostream>
#include <iomanip>
using namespace std;
 
static void print_addr(const char *type, const void *p){
	cout << right << setfill(' ');
	cout << setw(32) << type << ": ";
	cout << left << "I'm " << p << endl;
}
 
class with_ref{
public:
	void whoami(void) const{
		print_addr(__PRETTY_FUNCTION__, this);
	}
	void whoami(void){
		print_addr(__PRETTY_FUNCTION__, this);
		static_cast<const with_ref &>(*this).whoami();
	}
};
 
class without_ref{
public:
	void whoami(void) const{
		print_addr(__PRETTY_FUNCTION__, this);
	}
	void whoami(void){
		print_addr(__PRETTY_FUNCTION__, this);
		static_cast<const without_ref>(*this).whoami();
	}
};
 
int main() {
	with_ref with_ref_inst;
	with_ref_inst.whoami();
 
	without_ref without_ref_inst;
	without_ref_inst.whoami();
	return 0;
}
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0YXRpYyB2b2lkIHByaW50X2FkZHIoY29uc3QgY2hhciAqdHlwZSwgY29uc3Qgdm9pZCAqcCl7Cgljb3V0IDw8IHJpZ2h0IDw8IHNldGZpbGwoJyAnKTsKCWNvdXQgPDwgc2V0dygzMikgPDwgdHlwZSA8PCAiOiAiOwoJY291dCA8PCBsZWZ0IDw8ICJJJ20gIiA8PCBwIDw8IGVuZGw7Cn0KCmNsYXNzIHdpdGhfcmVmewpwdWJsaWM6Cgl2b2lkIHdob2FtaSh2b2lkKSBjb25zdHsKCQlwcmludF9hZGRyKF9fUFJFVFRZX0ZVTkNUSU9OX18sIHRoaXMpOwoJfQoJdm9pZCB3aG9hbWkodm9pZCl7CgkJcHJpbnRfYWRkcihfX1BSRVRUWV9GVU5DVElPTl9fLCB0aGlzKTsKCQlzdGF0aWNfY2FzdDxjb25zdCB3aXRoX3JlZiAmPigqdGhpcykud2hvYW1pKCk7Cgl9Cn07CgpjbGFzcyB3aXRob3V0X3JlZnsKcHVibGljOgoJdm9pZCB3aG9hbWkodm9pZCkgY29uc3R7CgkJcHJpbnRfYWRkcihfX1BSRVRUWV9GVU5DVElPTl9fLCB0aGlzKTsKCX0KCXZvaWQgd2hvYW1pKHZvaWQpewoJCXByaW50X2FkZHIoX19QUkVUVFlfRlVOQ1RJT05fXywgdGhpcyk7CgkJc3RhdGljX2Nhc3Q8Y29uc3Qgd2l0aG91dF9yZWY+KCp0aGlzKS53aG9hbWkoKTsKCX0KfTsKCmludCBtYWluKCkgewoJd2l0aF9yZWYgd2l0aF9yZWZfaW5zdDsKCXdpdGhfcmVmX2luc3Qud2hvYW1pKCk7CgkKCXdpdGhvdXRfcmVmIHdpdGhvdXRfcmVmX2luc3Q7Cgl3aXRob3V0X3JlZl9pbnN0Lndob2FtaSgpOwoJcmV0dXJuIDA7Cn0=