fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. using namespace std;
  5.  
  6. class Content {
  7. public:
  8. virtual void info() = 0;
  9. };
  10.  
  11. class ContentA : public Content {
  12. public:
  13. void info() override { cout << "Content A" << endl; }
  14. int serial() { return 123; }
  15. int num() { return 456; }
  16. };
  17.  
  18. class ContentB : public Content {
  19. public:
  20. void info() override { cout << "Content B" << endl; }
  21. int identifier() { return 789; }
  22. };
  23.  
  24. class Container {
  25. public:
  26. virtual shared_ptr<Content> content() = 0;
  27. virtual void info() = 0;
  28. void contentInfo() { content()->info(); }
  29. };
  30.  
  31. class ContainerA : public Container {
  32. public:
  33. ContainerA(shared_ptr<ContentA> content) : m_content(content) {}
  34. shared_ptr<Content> content() { return m_content; }
  35. void info() {
  36. auto identifier = m_content->serial() * m_content->num();
  37. cout << "Container A: " << identifier << endl;
  38. }
  39. protected:
  40. shared_ptr<ContentA> m_content;
  41. };
  42.  
  43. class ContainerB : public Container {
  44. public:
  45. ContainerB(shared_ptr<ContentB> content) : m_content(content) {}
  46. shared_ptr<Content> content() { return m_content; }
  47. void info() {
  48. cout << "Container B: " << m_content->identifier() << endl;
  49. }
  50. protected:
  51. shared_ptr<ContentB> m_content;
  52. };
  53.  
  54. int main() {
  55. ContainerA containerA(make_shared<ContentA>());
  56. containerA.info();
  57. containerA.contentInfo();
  58.  
  59. ContainerB containerB(make_shared<ContentB>());
  60. containerB.info();
  61. containerB.contentInfo();
  62.  
  63. return 0;
  64. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
Container A: 56088
Content A
Container B: 789
Content B