#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!"
}