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

class Task {
    public:
        Task(std::vector<std::unique_ptr<Task>> *list) {
        	if (list)
            	list->push_back(clone());
        }

        virtual void Run() {
            std::cout << "Called Task Run!" << std::endl;
        }
        virtual std::unique_ptr<Task> clone(){ return std::make_unique<Task>(*this);  }
};

class OverrideTask : public Task {
    public:
        OverrideTask(std::vector<std::unique_ptr<Task>> *list) : Task(nullptr) {
        	if (list)
            	list->push_back(clone());
        }
        void Run() override {
            std::cout << "Called Override Run!" << std::endl;
        }
        std::unique_ptr<Task> clone() override { return std::make_unique<OverrideTask>(*this); } 
};

int main() {
    std::cout << "Main method entered" << std::endl;
    std::vector<std::unique_ptr<Task>> listOfTasks;

    OverrideTask ot = OverrideTask(&listOfTasks);
    Task t = Task(&listOfTasks);

    for(int i = 0; i < listOfTasks.size(); i++) {
        listOfTasks[i]->Run(); // Will print "Called Task Run!" twice.
    }

    ot.Run(); // Prints "Called Override Run!"
    t.Run(); // Prints "Called Task Run!"
}