1. #include <iostream>
  2. class VirtualBase
  3. {
  4. public:
  5. virtual const char* str() {
  6. return "VirtualBase";
  7. }
  8.  
  9. };
  10.  
  11. class VirtualDerived1 : public VirtualBase
  12. {
  13. public:
  14.  
  15. virtual const char* str() {
  16. return "VirtualDerived1";
  17. }
  18.  
  19. };
  20.  
  21. class VirtualDerived2 : public VirtualBase
  22. {
  23. public:
  24.  
  25. virtual const char* str() {
  26. return "VirtualDerived2";
  27. }
  28.  
  29. };
  30.  
  31. class NonVirtualBase
  32. {
  33. static const char* NonVirtualBase_str()
  34. {
  35. return "NonVirtualBase";
  36. }
  37. protected:
  38. const char* (*const vstr)() ;
  39. NonVirtualBase(const char* (*const vstr)()) : vstr(vstr) {}
  40. public:
  41.  
  42. NonVirtualBase() : vstr(NonVirtualBase_str)
  43. {
  44. }
  45. const char* str()
  46. {
  47. return vstr();
  48. }
  49. };
  50.  
  51. class NonVirtualDerived1 : public NonVirtualBase
  52. {
  53. static const char* NonVirtualDerived1_str()
  54. {
  55. return "NonVirtualDerived1";
  56. }
  57. public:
  58. NonVirtualDerived1() : NonVirtualBase(NonVirtualDerived1_str) {}
  59. };
  60.  
  61. class NonVirtualDerived2 : public NonVirtualBase
  62. {
  63. static const char* NonVirtualDerived2_str()
  64. {
  65. return "NonVirtualDerived2";
  66. }
  67. public:
  68. NonVirtualDerived2() : NonVirtualBase(NonVirtualDerived2_str) {}
  69. };
  70.  
  71.  
  72.  
  73. int main()
  74. {
  75. VirtualBase* ptr[3];
  76. ptr[0] = new VirtualBase();
  77. ptr[1] = new VirtualDerived1();
  78. ptr[2] = new VirtualDerived2();
  79. for (int i = 0; i < 3; i++)
  80. {
  81. std::cout << ptr[i]->str() << std::endl;
  82. delete ptr[i];
  83. }
  84.  
  85. NonVirtualBase* vptr[3];
  86. vptr[0] = new NonVirtualBase();
  87. vptr[1] = new NonVirtualDerived1();
  88. vptr[2] = new NonVirtualDerived2();
  89. for (int i = 0; i < 3; i++)
  90. {
  91. std::cout << vptr[i]->str() << std::endl;
  92. delete vptr[i];
  93. }
  94. return 0;
  95. }


or.. 


  1. #include <functional>
  2.  
  3. class NonVirtualBase
  4. {
  5. protected:
  6. NonVirtualBase(std::function<const char*()>&& v_str) : str(v_str) {}
  7. public:
  8. const std::function<const char*()> str;
  9.  
  10. NonVirtualBase() : str([]() -> const char* { return "NonVirtualBase"; })
  11. {
  12. }
  13.  
  14. };
  15.  
  16. class NonVirtualDerived1 : public NonVirtualBase
  17. {
  18. public:
  19. NonVirtualDerived1() : NonVirtualBase([]()-> const char* {return "NonVirtualDerived1"; }) {}
  20.  
  21. };
  22. class NonVirtualDerived2 : public NonVirtualBase
  23. {
  24. public:
  25. NonVirtualDerived2() : NonVirtualBase([]()-> const char* {return "NonVirtualDerived2"; }) {}
  26. };

아침 수업 듣다가 졸려서 장난질 쳐본 것입니다