#include <iostream>
#include <memory>
class Animal {
public:
virtual ~Animal() = default;
virtual const char *says() const = 0;
static std::unique_ptr<Animal> makeLion()
{
class Lion : public Animal
{
public:
virtual const char *says() const override
{
return "roar";
}
};
return std::make_unique<Lion>();
}
static std::unique_ptr<Animal> makeTiger() {
class Tiger : public Animal
{
public:
virtual const char *says() const override
{
return "meow";
}
};
return std::make_unique<Tiger>();
}
static std::unique_ptr<Animal> makePig() {
class Pig : public Animal
{
public:
virtual const char *says() const override
{
return "That\'s all Folks!";
}
};
return std::make_unique<Pig>();
}
};
int main() {
std::cout << Animal::makeLion()->says() << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgQW5pbWFsIHsKcHVibGljOgogICAgdmlydHVhbCB+QW5pbWFsKCkgPSBkZWZhdWx0OwogICAgdmlydHVhbCBjb25zdCBjaGFyICpzYXlzKCkgY29uc3QgPSAwOwoKICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QW5pbWFsPiBtYWtlTGlvbigpCiAgICB7CiAgICAgICAgY2xhc3MgTGlvbiA6IHB1YmxpYyBBbmltYWwKICAgICAgICB7CiAgICAgICAgcHVibGljOgogICAgICAgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnNheXMoKSBjb25zdCBvdmVycmlkZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gInJvYXIiOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxMaW9uPigpOwogICAgfQogICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBbmltYWw+IG1ha2VUaWdlcigpIHsKICAgICAgICBjbGFzcyBUaWdlciA6IHB1YmxpYyBBbmltYWwKICAgICAgICB7CiAgICAgICAgcHVibGljOgogICAgICAgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnNheXMoKSBjb25zdCBvdmVycmlkZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gIm1lb3ciOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxUaWdlcj4oKTsKICAgIH0KICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QW5pbWFsPiBtYWtlUGlnKCkgewogICAgICAgIGNsYXNzIFBpZyA6IHB1YmxpYyBBbmltYWwKICAgICAgICB7CiAgICAgICAgcHVibGljOgogICAgICAgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnNheXMoKSBjb25zdCBvdmVycmlkZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlRoYXRcJ3MgYWxsIEZvbGtzISI7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFBpZz4oKTsKICAgIH0KfTsKCmludCBtYWluKCkgeyAgICAKICAgIHN0ZDo6Y291dCA8PCBBbmltYWw6Om1ha2VMaW9uKCktPnNheXMoKSA8PCBzdGQ6OmVuZGw7Cn0K