 
#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();
}