#include <iostream>
#include <memory>
#include <vector>
class Foo
{
public:
virtual void fooFunc()
{
std::cout << "Foo\n";
}
};
class Bar : public Foo
{
public:
virtual void fooFunc()
{
std::cout << "Bar\n";
}
};
int main()
{
std::vector< std::shared_ptr<Foo> > vec;
vec.push_back(std::static_pointer_cast<Foo>(std::make_shared<Bar>()));
vec.back()->fooFunc();
vec.push_back(std::make_shared<Bar>());
vec.back()->fooFunc();
}
IAojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDx2ZWN0b3I+CiAKY2xhc3MgRm9vCnsKcHVibGljOgogICAgdmlydHVhbCB2b2lkIGZvb0Z1bmMoKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiRm9vXG4iOwogICAgfQp9OwogCmNsYXNzIEJhciA6IHB1YmxpYyBGb28KewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgZm9vRnVuYygpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJCYXJcbiI7CiAgICB9Cn07CiAKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3Rvcjwgc3RkOjpzaGFyZWRfcHRyPEZvbz4gPiB2ZWM7CiAgICB2ZWMucHVzaF9iYWNrKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxGb28+KHN0ZDo6bWFrZV9zaGFyZWQ8QmFyPigpKSk7CiAgICB2ZWMuYmFjaygpLT5mb29GdW5jKCk7CiAgICB2ZWMucHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8QmFyPigpKTsKICAgIHZlYy5iYWNrKCktPmZvb0Z1bmMoKTsKfQ==