fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. class D1;
  5. class D2;
  6. class D3;
  7.  
  8. class Base {
  9. public:
  10. void func(const D1& obj) const
  11. {
  12. return this->applyFunc(obj);
  13. }
  14.  
  15. void func(const D2& obj) const
  16. {
  17. return this->applyFunc(obj);
  18. }
  19.  
  20. void func(const D3& obj) const
  21. {
  22. return this->applyFunc(obj);
  23. }
  24.  
  25. private:
  26. virtual void applyFunc(const D1& obj) const = 0;
  27. virtual void applyFunc(const D2& obj) const = 0;
  28. virtual void applyFunc(const D3& obj) const = 0;
  29. };
  30.  
  31. class D1 : public Base {
  32. private:
  33. // Inherited via Base
  34. virtual void applyFunc(const D1& obj) const override
  35. {
  36. std::cout << "D1 & D2" << std::endl;
  37. return;
  38. }
  39. virtual void applyFunc(const D2& obj) const override
  40. {
  41. std::cout << "D2 & D2" << std::endl;
  42. return;
  43. }
  44. virtual void applyFunc(const D3& obj) const override
  45. {
  46. std::cout << "D3 & D2" << std::endl;
  47. return;
  48. }
  49. };
  50.  
  51. class D2 : public Base {
  52. private:
  53. // Inherited via Base
  54. virtual void applyFunc(const D1& obj) const override
  55. {
  56. std::cout << "D2 call D1" << std::endl;
  57. return;
  58. }
  59. virtual void applyFunc(const D2& obj) const override
  60. {
  61. std::cout << "D2 call D2" << std::endl;
  62. return;
  63. }
  64. virtual void applyFunc(const D3& obj) const override
  65. {
  66. std::cout << "D2 call D3" << std::endl;
  67. return;
  68. }
  69. };
  70.  
  71. class D3 : public Base {
  72. private:
  73. void printDontCallMe() const
  74. {
  75. std::cout << "Don't call me." << std::endl;
  76. return;
  77. }
  78.  
  79. private:
  80. // Inherited via Base
  81. virtual void applyFunc(const D1& obj) const override
  82. {
  83. this->printDontCallMe();
  84. return;
  85. }
  86. virtual void applyFunc(const D2& obj) const override
  87. {
  88. this->printDontCallMe();
  89. return;
  90. }
  91. virtual void applyFunc(const D3& obj) const override
  92. {
  93. this->printDontCallMe();
  94. return;
  95. }
  96. };
  97.  
  98. int main()
  99. {
  100. const auto d1 = std::make_unique<const D1>();
  101. const auto d2 = std::make_unique<const D2>();
  102. const auto d3 = std::make_unique<const D3>();
  103. d1->func(*d1); d1->func(*d2); d1->func(*d3);
  104. d2->func(*d1); d2->func(*d2); d2->func(*d3);
  105. d3->func(*d1); d3->func(*d2); d3->func(*d3);
  106. return 0;
  107. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
D1 & D2
D2 & D2
D3 & D2
D2 call D1
D2 call D2
D2 call D3
Don't call me.
Don't call me.
Don't call me.