利用多态实现计算器的好处
    1,组织结构清晰
    2,可读性强
    3,对于前期和后期的扩展以及维护性高

    1. #include<iostream>
    2. #include<string>
    3. using namespace std;
    4. class Calculator
    5. {
    6. public:
    7. int getResult(string oper)
    8. {
    9. if(oper=="+")
    10. {
    11. return m_a+m_b;
    12. }
    13. if(oper=="-")
    14. {
    15. return m_a-m_b;
    16. }
    17. if(oper=="*")
    18. {
    19. return m_a*m_b;
    20. }
    21. return 0;
    22. }
    23. int m_a;
    24. int m_b;
    25. };
    26. void show()
    27. {
    28. Calculator p;
    29. p.m_a=20;
    30. p.m_b=30;
    31. cout<<p.m_a<<"+"<<p.m_b<<"="<<p.getResult("+")<<endl;
    32. cout<<p.m_a<<"-"<<p.m_b<<"="<<p.getResult("-")<<endl;
    33. cout<<p.m_a<<"*"<<p.m_b<<"="<<p.getResult("*")<<endl;
    34. }
    35. //利用多态实现计算器的好处
    36. //1,组织结构清晰
    37. //2,可读性强
    38. //3,对于前期和后期的扩展以及维护性高。
    39. class abstract
    40. {
    41. public:
    42. virtual int getResult()
    43. {
    44. return 0;
    45. }
    46. virtual ~abstract()
    47. {
    48. cout<<"析构函数"<<endl;
    49. }
    50. int m_a;
    51. int m_b;
    52. };
    53. class Addabstract:public abstract
    54. {
    55. public:
    56. int getResult()
    57. {
    58. return m_a+m_b;
    59. }
    60. };
    61. class subabstract:public abstract
    62. {
    63. public:
    64. int getResult()
    65. {
    66. return m_a-m_b;
    67. }
    68. };
    69. class Mulabstract:public abstract
    70. {
    71. public:
    72. int getResult()
    73. {
    74. return m_a*m_b;
    75. }
    76. };
    77. void test()
    78. {
    79. //多态的使用条件。
    80. //父类的(指针)或者(引用)指向子类的对象。
    81. abstract *p;
    82. p=new Addabstract;
    83. p->m_a=10;
    84. p->m_b=10;
    85. cout<<p->m_a<<"+"<<p->m_b<<"="<<p->getResult()<<endl;
    86. delete p;
    87. p=new subabstract;
    88. p->m_a=102;
    89. p->m_b=10;
    90. cout<<p->m_a<<"-"<<p->m_b<<"="<<p->getResult()<<endl;
    91. //用完后记得销毁, 这里的话如果用了指针且开辟了空间就是(p=new Addabstract;)句话
    92. //需要在虚基类(抽象类)中定义虚析构函数否则的话他只会调用抽象类的析构函数不会调用子类的析构函数。
    93. //如果不用的话编译器会进行报错。
    94. delete p;
    95. p=new Mulabstract;
    96. p->m_a=5;
    97. p->m_b=10;
    98. cout<<p->m_a<<"*"<<p->m_b<<"="<<p->getResult()<<endl;
    99. delete p;
    100. }
    101. // 如果想扩展新的功能,需求修改源码
    102. // 在正式开发中 提倡 开闭原则
    103. // 开闭原则:对扩展进行开放,对修改进行关闭。
    104. int main()
    105. {
    106. show();
    107. test();
    108. return 0;
    109. }

    网址:链接