#include <iostream>
#include <memory>
#include <string>
class IFoo
{
public:
virtual void f() = 0;
virtual std::string getName() const noexcept = 0;
virtual ~IFoo() noexcept = default;
};
class Foo : public IFoo
{
public:
explicit Foo(const std::string& name) : name_{name} {}
void f() override = 0;
std::string getName() const noexcept
{
return name_;
}
private:
std::string name_;
};
class FooBar final : public Foo
{
public:
FooBar() : Foo("FooBar") {}
void f() override
{
std::cout << "Hello from FooBar! :-)" << std::endl;
}
};
int main()
{
std::shared_ptr<IFoo> foo{ std::make_shared<FooBar>() };
foo->f();
std::cout << foo->getName() << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgSUZvbwp7CnB1YmxpYzoKCXZpcnR1YWwgdm9pZCBmKCkgPSAwOwoJdmlydHVhbCBzdGQ6OnN0cmluZyBnZXROYW1lKCkgY29uc3Qgbm9leGNlcHQgPSAwOwoJCgl2aXJ0dWFsIH5JRm9vKCkgbm9leGNlcHQgPSBkZWZhdWx0Owp9OwoKY2xhc3MgRm9vIDogcHVibGljIElGb28KewpwdWJsaWM6CglleHBsaWNpdCBGb28oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIDogbmFtZV97bmFtZX0ge30KCQoJdm9pZCBmKCkgb3ZlcnJpZGUgPSAwOwoKCXN0ZDo6c3RyaW5nIGdldE5hbWUoKSBjb25zdCBub2V4Y2VwdAoJewoJCXJldHVybiBuYW1lXzsKCX0KcHJpdmF0ZToKCXN0ZDo6c3RyaW5nIG5hbWVfOwp9OwoKY2xhc3MgRm9vQmFyIGZpbmFsIDogcHVibGljIEZvbwp7CnB1YmxpYzoKCUZvb0JhcigpIDogRm9vKCJGb29CYXIiKSB7fQoJCgl2b2lkIGYoKSBvdmVycmlkZQoJewoJCXN0ZDo6Y291dCA8PCAiSGVsbG8gZnJvbSBGb29CYXIhIDotKSIgPDwgc3RkOjplbmRsOwoJfQp9OwoKaW50IG1haW4oKQp7CglzdGQ6OnNoYXJlZF9wdHI8SUZvbz4gZm9veyBzdGQ6Om1ha2Vfc2hhcmVkPEZvb0Jhcj4oKSB9OwoJCglmb28tPmYoKTsKCXN0ZDo6Y291dCA8PCBmb28tPmdldE5hbWUoKSA8PCBzdGQ6OmVuZGw7CgoJcmV0dXJuIDA7Cn0=