fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <memory>
  4.  
  5. class Task {
  6. public:
  7. Task(std::vector<std::unique_ptr<Task>> *list) {
  8. if (list)
  9. list->push_back(clone());
  10. }
  11.  
  12. virtual void Run() {
  13. std::cout << "Called Task Run!" << std::endl;
  14. }
  15. virtual std::unique_ptr<Task> clone(){ return std::make_unique<Task>(*this); }
  16. };
  17.  
  18. class OverrideTask : public Task {
  19. public:
  20. OverrideTask(std::vector<std::unique_ptr<Task>> *list) : Task(nullptr) {
  21. if (list)
  22. list->push_back(clone());
  23. }
  24. void Run() override {
  25. std::cout << "Called Override Run!" << std::endl;
  26. }
  27. std::unique_ptr<Task> clone() override { return std::make_unique<OverrideTask>(*this); }
  28. };
  29.  
  30. int main() {
  31. std::cout << "Main method entered" << std::endl;
  32. std::vector<std::unique_ptr<Task>> listOfTasks;
  33.  
  34. OverrideTask ot = OverrideTask(&listOfTasks);
  35. Task t = Task(&listOfTasks);
  36.  
  37. for(int i = 0; i < listOfTasks.size(); i++) {
  38. listOfTasks[i]->Run(); // Will print "Called Task Run!" twice.
  39. }
  40.  
  41. ot.Run(); // Prints "Called Override Run!"
  42. t.Run(); // Prints "Called Task Run!"
  43. }
Success #stdin #stdout 0s 4788KB
stdin
Standard input is empty
stdout
Main method entered
Called Override Run!
Called Task Run!
Called Override Run!
Called Task Run!