#include <iostream>
#include <memory>
#include <vector>

class Foo
{
public:
    virtual void Update(){
        std::cout << "Update idle" << std::endl;
    }; 
};

class Foo1 : public Foo
{
public:
    void Update() override
    {
        std::cout << "Update Foo1" << std::endl;
    }
};

class Foo2 : public Foo
{
    void Update() override
    {
        std::cout << Bar() << std::endl;
    }

    std::string Bar(){
        return "Update Foo2";
    }
};


int main() {
    std::vector<std::shared_ptr<Foo>> vec{
        std::make_shared<Foo>(), 
        std::make_shared<Foo1>(), 
        std::make_shared<Foo2>()
    };

    for (auto &&ptr : vec)
    {
        ptr->Update();
    }
}