#include <iostream>
#include <memory>
#include <vector>
class IFoo
{
public:
virtual void f() const noexcept = 0;
};
using IFooPtr = std::shared_ptr<IFoo>;
class Foo : public IFoo
{
public:
void f() const noexcept override
{
std::cout << "Foo" << std::endl;
}
};
class NaughtyFoo final : public Foo
{
public:
void f() const noexcept override
{
std::cout << "This Foo is very naughty..." << std::endl;
}
};
class GoodFoo final : public Foo
{};
int main()
{
const auto naughtyFoo = std::make_shared<NaughtyFoo>();
const auto goodFoo = std::make_shared<GoodFoo>();
std::vector<IFooPtr> foos{ naughtyFoo, goodFoo };
for (const auto& foo : foos)
{
if (foo)
{
foo->f();
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgoKY2xhc3MgSUZvbwp7CnB1YmxpYzoKCXZpcnR1YWwgdm9pZCBmKCkgY29uc3Qgbm9leGNlcHQgPSAwOwp9OwoKdXNpbmcgSUZvb1B0ciA9IHN0ZDo6c2hhcmVkX3B0cjxJRm9vPjsKCmNsYXNzIEZvbyA6IHB1YmxpYyBJRm9vCnsKcHVibGljOgoJdm9pZCBmKCkgY29uc3Qgbm9leGNlcHQgb3ZlcnJpZGUKCXsKCQlzdGQ6OmNvdXQgPDwgIkZvbyIgPDwgc3RkOjplbmRsOwoJfQp9OwoKY2xhc3MgTmF1Z2h0eUZvbyBmaW5hbCA6IHB1YmxpYyBGb28KewpwdWJsaWM6Cgl2b2lkIGYoKSBjb25zdCBub2V4Y2VwdCBvdmVycmlkZQoJewoJCXN0ZDo6Y291dCA8PCAiVGhpcyBGb28gaXMgdmVyeSBuYXVnaHR5Li4uIiA8PCBzdGQ6OmVuZGw7Cgl9Cn07CgpjbGFzcyBHb29kRm9vIGZpbmFsIDogcHVibGljIEZvbwp7fTsKCmludCBtYWluKCkKewoJY29uc3QgYXV0byBuYXVnaHR5Rm9vID0gc3RkOjptYWtlX3NoYXJlZDxOYXVnaHR5Rm9vPigpOwoJY29uc3QgYXV0byBnb29kRm9vID0gc3RkOjptYWtlX3NoYXJlZDxHb29kRm9vPigpOwoJCglzdGQ6OnZlY3RvcjxJRm9vUHRyPiBmb29zeyBuYXVnaHR5Rm9vLCBnb29kRm9vIH07Cglmb3IgKGNvbnN0IGF1dG8mIGZvbyA6IGZvb3MpCgl7CgkJaWYgKGZvbykKCQl7CgkJCWZvby0+ZigpOwoJCX0KCX0KCglyZXR1cm4gMDsKfQ==