#include <iostream>
#include <vector>
#include <memory>
class Fruit
{
public:
virtual void getOld() = 0;
};
class Orange : Fruit
{
public:
Orange() {}
void add(std::shared_ptr<Fruit> f)
{
v.push_back(f);
}
std::shared_ptr<Fruit> get(int k)
{
return v[k];
}
void getOld()
{
std::cout << "Orange - I'm old." << std::endl;
}
private:
std::vector<std::shared_ptr<Fruit>> v;
};
class Bitter : public Fruit
{
public:
Bitter() {}
void getOld()
{
std::cout << "Bitter - I'm old." << std::endl;
}
void getNew()
{
std::cout << "Bitter - I'm new." << std::endl;
}
};
int main(int argc, char ** argv)
{
auto orange = new Orange;
orange->add(std::make_shared<Bitter>());
auto bitter = orange->get(0);
bitter->getOld();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgRnJ1aXQKewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgZ2V0T2xkKCkgPSAwOwp9OwoKY2xhc3MgT3JhbmdlIDogRnJ1aXQKewpwdWJsaWM6CiAgICBPcmFuZ2UoKSB7fQoKICAgIHZvaWQgYWRkKHN0ZDo6c2hhcmVkX3B0cjxGcnVpdD4gZikKICAgIHsKICAgICAgICB2LnB1c2hfYmFjayhmKTsKICAgIH0KCiAgICBzdGQ6OnNoYXJlZF9wdHI8RnJ1aXQ+IGdldChpbnQgaykKICAgIHsKICAgICAgICByZXR1cm4gdltrXTsKICAgIH0KCiAgICB2b2lkIGdldE9sZCgpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJPcmFuZ2UgLSBJJ20gb2xkLiIgPDwgc3RkOjplbmRsOwogICAgfQpwcml2YXRlOgogICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEZydWl0Pj4gdjsKfTsKCmNsYXNzIEJpdHRlciA6IHB1YmxpYyBGcnVpdAp7CnB1YmxpYzoKICAgIEJpdHRlcigpIHt9CgogICAgdm9pZCBnZXRPbGQoKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiQml0dGVyIC0gSSdtIG9sZC4iIDw8IHN0ZDo6ZW5kbDsKICAgIH0KCiAgICB2b2lkIGdldE5ldygpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJCaXR0ZXIgLSBJJ20gbmV3LiIgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKewogICAgYXV0byBvcmFuZ2UgPSBuZXcgT3JhbmdlOwogICAgb3JhbmdlLT5hZGQoc3RkOjptYWtlX3NoYXJlZDxCaXR0ZXI+KCkpOwogICAgYXV0byBiaXR0ZXIgPSBvcmFuZ2UtPmdldCgwKTsKICAgIGJpdHRlci0+Z2V0T2xkKCk7CgogICAgcmV0dXJuIDA7Cn0=