I am trying to implement polymorphism, so I can expand my project later with minimal refactoring. I am also attempting to implement the Command pattern from this book (https://gameprogrammingpatterns.com/command.html).
Desired outcome: My most derived classes implementation of virtual functions are called through a std::shared_ptr<Base>(Most_Derived_Class). If this is the wrong syntax, I want to handle my most derived class through a shared pointer to one of its base classes.
Current outcome: Base class implementations of virtual functions are called through the pointer mentioned in desired outcome.
Here is a runnable, simplified version of my code:
#include <iostream>
#include <vector>
class Base
{
public:
    Base()
    {
    }
    void virtual update()
    {
        std::cout << "no update function\n";
    }
    void virtual draw()
    {
        std::cout << "no draw function\n";
    }
};
class Derived : public Base
{
public:
    Derived();
    void draw() override;
    void update() override;
};
Derived::Derived()
{
    
}
void Derived::draw()
{
    std::cout << "Derived Draw Called\n";
}
void Derived::update()
{
    std::cout << "Derived Update Called\n";
}
class Second_Derived : public Derived
{
public:
    Second_Derived() {}
    virtual void move_up() { std::cout << "Second_Derived Move_Up called\n"; };
};
class Third_Derived : public Second_Derived
{
public:
    Third_Derived();
    ~Third_Derived();
    void move_up() override;
    void draw() override;
    void update() override;
};
Third_Derived::Third_Derived() {}
Third_Derived::~Third_Derived() {}
void Third_Derived::move_up()
{
    std::cout << "Third Derived Move_Up called\n";
}
void Third_Derived::draw()
{
    std::cout << "Third Derived draw called\n";
}
void Third_Derived::update()
{
    std::cout << "Third Derived update Called\n";
}
class Command
{
public:
    virtual void execute(Second_Derived s_derived) { std::cout << "Base Command execute called\n"; }
};
class Move_Up : public Command
{
public:
    Move_Up() {}
    void execute(Second_Derived s_derived) override
    {
        std::cout << "Move_Up called\n";
        s_derived.move_up();
    }
};
class Input_Handler
{
public:
    Input_Handler() {};
    Command* handle_input()
    {
        return &return_command;
    }
private:
    Move_Up return_command;
};
class Caller
{
public:
    Caller();
    void update();
    void draw();
    void reg_obj(std::shared_ptr<Second_Derived> obj);
private:
    void process_inputs();
    Input_Handler i_handler;
    std::vector<std::shared_ptr<Second_Derived>> all_objects;
};
Caller::Caller()
{
    Third_Derived third_derived_class{};
    reg_obj(std::make_shared<Second_Derived>(third_derived_class));
}
void Caller::process_inputs()
{
    Command* current_inputs = i_handler.handle_input();
    if (current_inputs)
    {
        current_inputs->execute(*all_objects[0]);
    }
}
void Caller::update()
{
    process_inputs();
    for (int i = 0; i < all_objects.size(); i++)
    {
        all_objects[i]->update();
    }
}
void Caller::draw()
{
    for (int i = 0; i < all_objects.size(); i++)
    {
        all_objects[i]->draw();
    }
}
void Caller::reg_obj(std::shared_ptr<Second_Derived> obj)
{
    all_objects.push_back(obj);
}
int main()
{
    Caller caller{};
    while (true)
    {
        caller.update();
        caller.draw();
    }
}
Bonus: If you can recommend me solid (ideally free) C++ polymorphism resources, because this is my second run-in with polymorphism issues, and it's pretty clear to me that I need to do more reading on it.
