#include <iostream>
using namespace std;
class Abstract
{
public:
virtual void me() = 0;
virtual Abstract * Clone() = 0;
virtual ~Abstract(){}
};
class Base: public Abstract
{
public:
void me()
{
cout << "Base\n";
}
Abstract * Clone()
{
return new Base;
}
virtual ~Base(){}
};
class Derived: public Base
{
public:
void me()
{
cout << "Derived\n";
}
Derived * Clone()
{
return new Derived;
}
virtual ~Derived(){}
};
void who(Abstract * a)
{
Abstract * b = a->Clone();
b->me();
delete b;
};
int main()
{
Base * b = new Base;
Derived * d = new Derived;
who(b);
who(d);
delete b;
delete d;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKY2xhc3MgQWJzdHJhY3QKewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgbWUoKSA9IDA7CiAgICB2aXJ0dWFsIEFic3RyYWN0ICogQ2xvbmUoKSA9IDA7CiAgICB2aXJ0dWFsIH5BYnN0cmFjdCgpe30KfTsKIApjbGFzcyBCYXNlOiBwdWJsaWMgQWJzdHJhY3QKewpwdWJsaWM6CiAgICB2b2lkIG1lKCkKICAgIHsKICAgICAgICBjb3V0IDw8ICJCYXNlXG4iOwogICAgfQogICAgQWJzdHJhY3QgKiBDbG9uZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBCYXNlOwogICAgfQogICAgdmlydHVhbCB+QmFzZSgpe30KfTsKIApjbGFzcyBEZXJpdmVkOiBwdWJsaWMgQmFzZQp7CnB1YmxpYzoKICAgIHZvaWQgbWUoKQogICAgewogICAgICAgIGNvdXQgPDwgIkRlcml2ZWRcbiI7CiAgICB9CiAgICBEZXJpdmVkICogQ2xvbmUoKQogICAgewogICAgICAgIHJldHVybiBuZXcgRGVyaXZlZDsKICAgIH0KICAgIHZpcnR1YWwgfkRlcml2ZWQoKXt9Cn07CiAKdm9pZCB3aG8oQWJzdHJhY3QgKiBhKQp7CiAgICBBYnN0cmFjdCAqIGIgPSBhLT5DbG9uZSgpOwogICAgYi0+bWUoKTsKICAgIGRlbGV0ZSBiOwp9OwogCmludCBtYWluKCkKewogICAgQmFzZSAgICAqIGIgPSBuZXcgQmFzZTsKICAgIERlcml2ZWQgKiBkID0gbmV3IERlcml2ZWQ7CiAKICAgIHdobyhiKTsKICAgIHdobyhkKTsKCiAgICBkZWxldGUgYjsKICAgIGRlbGV0ZSBkOwoKfQoK