#include <iostream>
using namespace std;
class base
{
public:
virtual base& downcast()
{
cout << "Downcast-base" << endl;
return *this;
}
};
class derived: public base
{
public:
virtual derived& downcast()
{
cout << "Downcast-derived" << endl;
return *this;
}
};
void foo(const base& a)
{
cout << "base" << endl;
}
void foo(const derived& a)
{
cout << "derived" << endl;
}
int main()
{
base* ptr1 = new(base);
base* ptr2 = new(derived);
foo(ptr1->downcast());
foo(ptr2->downcast());
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgYmFzZQp7CnB1YmxpYzoKICB2aXJ0dWFsIGJhc2UmIGRvd25jYXN0KCkKICB7CiAgCWNvdXQgPDwgIkRvd25jYXN0LWJhc2UiIDw8IGVuZGw7CiAgICByZXR1cm4gKnRoaXM7CiAgfQp9OwoKY2xhc3MgZGVyaXZlZDogcHVibGljIGJhc2UKewpwdWJsaWM6CiAgdmlydHVhbCBkZXJpdmVkJiBkb3duY2FzdCgpCiAgewogIAljb3V0IDw8ICJEb3duY2FzdC1kZXJpdmVkIiA8PCBlbmRsOwogICAgcmV0dXJuICp0aGlzOwogIH0KfTsKCnZvaWQgZm9vKGNvbnN0IGJhc2UmIGEpCnsKICBjb3V0IDw8ICJiYXNlIiA8PCBlbmRsOwp9Cgp2b2lkIGZvbyhjb25zdCBkZXJpdmVkJiBhKQp7CiAgY291dCA8PCAiZGVyaXZlZCIgPDwgZW5kbDsKfQoKaW50IG1haW4oKQp7CiAgYmFzZSogcHRyMSA9IG5ldyhiYXNlKTsKICBiYXNlKiBwdHIyID0gbmV3KGRlcml2ZWQpOwoKICBmb28ocHRyMS0+ZG93bmNhc3QoKSk7CiAgZm9vKHB0cjItPmRvd25jYXN0KCkpOwoKICByZXR1cm4gMDsKfQ==