• C++ 多态:Package继承层次


    【问题描述】


    • 使用在上篇创建的Package类继承层次结构,创建一个用于显示若干Package的地址信息并计算其运输费用的程序。
    • 程序应该包含一个Package指针的vector 对象,其中的指针指向TwoDayPackage 对象和OvernightPackage 对象。遍历该vector 对象,多态性地处理这些Package。
    • 对于每个Package调用获取函数,获得发送者和接收者的地址信息,然后打印输出这两个地址,就像它们出现在邮包标签上一样。
    • 此外,调用每个Package的calculateCost成员函数并输出结果。跟踪记录该vector 中所有 Package的总的运输费用,并在循环遍历结束时显示此总费用。

    1.创建基类Package

    1. class Package
    2. {
    3. public://声明为常量引用,使用引用避免copy,使用const能保护数据
    4. Package(){}
    5. Package(const string&, const string&, const string&, const string&,const string&, int , double , double);
    6. double getWeight() const;
    7. double getCostPerOunce() const;
    8. virtual double calculateCost()
    9. {
    10. double transCosts;
    11. transCosts=weight*costPerOunce;
    12. return transCosts;
    13. }
    14. virtual void get(){}
    15. protected:
    16. string senderName;
    17. string recipientName;
    18. string address;
    19. string city;
    20. string state;
    21. int postalCode;
    22. double weight;
    23. double costPerOunce;//Cost per ounce每一盎司费用 ;盎司:英美制单位,既是重量单位又是容量单位
    24. };
    2.TwoDayPackage类,继承于Package类
    1. class TwoDayPackage : public Package
    2. {
    3. public:
    4. TwoDayPackage(){}
    5. TwoDayPackage(const string&, const string&, const string&, const string&,const string&, int , double , double, double);
    6. virtual double calculateCost() //基类的成员函数需要在派生类内声明才可被使用
    7. {
    8. double transCosts;
    9. transCosts = Package::calculateCost() + surfaceMailCosts;
    10. return transCosts;
    11. }
    12. virtual void get()
    13. {
    14. cout<<"寄件人信息:"<"姓名:"<"******************"<
    15. cout<<"收件人信息:"<"姓名:"<"地址:"<" " <" "<" "
    16. <"邮政编号: "<"******************"<
    17. }
    18. private:
    19. double surfaceMailCosts;//平寄费
    20. };
    3.OvernightPackage类,继承于Package类
    1. class OvernightPackage : public Package
    2. {
    3. public:
    4. OvernightPackage(){}
    5. OvernightPackage(const string&, const string&, const string&, const string&,const string&, int , double , double, double);
    6. virtual double calculateCost()
    7. {
    8. double transCosts;
    9. transCosts = Package::calculateCost() + extraCosts;
    10. return transCosts;
    11. }
    12. virtual void get()
    13. {
    14. cout<<"寄件人信息:"<"姓名:"<"******************"<
    15. cout<<"收件人信息:"<"姓名:"<"地址:"<" " <" "<" "
    16. <"邮政编号: "<"******************"<
    17. }
    18. private:
    19. double extraCosts;//连夜快递服务的额外费用
    20. };
    4.Package类的方法实现
    1. Package::Package(const string& senderName1,const string& recipientName1, const string& address1, const string& city1,const string& state1,int postalCode1, double weight1, double costPerOunce1)
    2. : senderName(senderName1),recipientName(recipientName1),address(address1),city(city1),state(state1),postalCode(postalCode1),weight(weight1),costPerOunce(costPerOunce1)
    3. {
    4. if(weight1>0)
    5. {
    6. weight=weight1;
    7. }
    8. else
    9. {
    10. weight=1;
    11. cout << "Weight less than 0 !" << endl;
    12. }
    13. }
    14. double Package::getWeight() const
    15. {
    16. return weight;
    17. }
    18. double Package::getCostPerOunce() const
    19. {
    20. return costPerOunce;
    21. }
    5.TwoDayPackage类的方法实现
    1. TwoDayPackage::TwoDayPackage(const string& senderName1,const string& recipientName1, const string& address1, const string& city1,const string& state1,int postalCode1, double weight1, double costPerOunce1,double surfaceMailCosts1)
    2. :Package(senderName1,recipientName1,address1,city1,state1,postalCode1,weight1,costPerOunce1)
    3. {
    4. surfaceMailCosts=surfaceMailCosts1;
    5. }
    6.OvernightPackage类的方法实现
    1. OvernightPackage::OvernightPackage(const string& senderName1,const string& recipientName1, const string& address1, const string& city1,const string& state1,int postalCode1, double weight1, double costPerOunce1,double extraCosts1)
    2. :Package(senderName1,recipientName1,address1,city1,state1,postalCode1,weight1,costPerOunce1)
    3. {
    4. extraCosts=extraCosts1;
    5. }

    7.测试程序

    1. //测试程序
    2. int main()
    3. {
    4. TwoDayPackage *ptr_Two=new TwoDayPackage("Lihua","Kandy","America","NewYork","NewYorkState",10041,30,5,36.2);
    5. OvernightPackage *ptr_Over=new OvernightPackage("Zhang shan","Kandy","America","Houston","Texas",77001,50,8,25.6);
    6. vector PackageClass;
    7. PackageClass.push_back(ptr_Two);
    8. PackageClass.push_back(ptr_Over);
    9. vector::iterator iter;
    10. for(iter = PackageClass.begin(); iter != PackageClass.end(); ++iter)
    11. {
    12. cout<<"该快递的具体信息如下:"<
    13. (*iter)->get();
    14. cout<<"该包裹的运输费用为: "<<(*iter)->calculateCost()<
    15. system("pause");
    16. system("cls");
    17. }
    18. cout<<"程序退出!"<
    19. delete ptr_Two;
    20. delete ptr_Over;
    21. return 0;
    22. }

    完整的代码如下:

    1. ///
    2. //基于Package类继承层次结构
    3. //Package继承层次
    4. //
    5. #include
    6. #include
    7. #include
    8. #include
    9. using namespace std;
    10. class Package
    11. {
    12. public://声明为常量引用,使用引用避免copy,使用const能保护数据
    13. Package(){}
    14. Package(const string&, const string&, const string&, const string&,const string&, int , double , double);
    15. double getWeight() const;
    16. double getCostPerOunce() const;
    17. virtual double calculateCost()
    18. {
    19. double transCosts;
    20. transCosts=weight*costPerOunce;
    21. return transCosts;
    22. }
    23. virtual void get(){}
    24. protected:
    25. string senderName;
    26. string recipientName;
    27. string address;
    28. string city;
    29. string state;
    30. int postalCode;
    31. double weight;
    32. double costPerOunce;//Cost per ounce每一盎司费用 ;盎司:英美制单位,既是重量单位又是容量单位
    33. };
    34. class TwoDayPackage : public Package
    35. {
    36. public:
    37. TwoDayPackage(){}
    38. TwoDayPackage(const string&, const string&, const string&, const string&,const string&, int , double , double, double);
    39. virtual double calculateCost() //基类的成员函数需要在派生类内声明才可被使用
    40. {
    41. double transCosts;
    42. transCosts = Package::calculateCost() + surfaceMailCosts;
    43. return transCosts;
    44. }
    45. virtual void get()
    46. {
    47. cout<<"寄件人信息:"<"姓名:"<"******************"<
    48. cout<<"收件人信息:"<"姓名:"<"地址:"<" " <" "<" "
    49. <"邮政编号: "<"******************"<
    50. }
    51. private:
    52. double surfaceMailCosts;//平寄费
    53. };
    54. class OvernightPackage : public Package
    55. {
    56. public:
    57. OvernightPackage(){}
    58. OvernightPackage(const string&, const string&, const string&, const string&,const string&, int , double , double, double);
    59. virtual double calculateCost()
    60. {
    61. double transCosts;
    62. transCosts = Package::calculateCost() + extraCosts;
    63. return transCosts;
    64. }
    65. virtual void get()
    66. {
    67. cout<<"寄件人信息:"<"姓名:"<"******************"<
    68. cout<<"收件人信息:"<"姓名:"<"地址:"<" " <" "<" "
    69. <"邮政编号: "<"******************"<
    70. }
    71. private:
    72. double extraCosts;//连夜快递服务的额外费用
    73. };
    74. Package::Package(const string& senderName1,const string& recipientName1, const string& address1, const string& city1,const string& state1,int postalCode1, double weight1, double costPerOunce1)
    75. : senderName(senderName1),recipientName(recipientName1),address(address1),city(city1),state(state1),postalCode(postalCode1),weight(weight1),costPerOunce(costPerOunce1)
    76. {
    77. if(weight1>0)
    78. {
    79. weight=weight1;
    80. }
    81. else
    82. {
    83. weight=1;
    84. cout << "Weight less than 0 !" << endl;
    85. }
    86. }
    87. double Package::getWeight() const
    88. {
    89. return weight;
    90. }
    91. double Package::getCostPerOunce() const
    92. {
    93. return costPerOunce;
    94. }
    95. TwoDayPackage::TwoDayPackage(const string& senderName1,const string& recipientName1, const string& address1, const string& city1,const string& state1,int postalCode1, double weight1, double costPerOunce1,double surfaceMailCosts1)
    96. :Package(senderName1,recipientName1,address1,city1,state1,postalCode1,weight1,costPerOunce1)
    97. {
    98. surfaceMailCosts=surfaceMailCosts1;
    99. }
    100. OvernightPackage::OvernightPackage(const string& senderName1,const string& recipientName1, const string& address1, const string& city1,const string& state1,int postalCode1, double weight1, double costPerOunce1,double extraCosts1)
    101. :Package(senderName1,recipientName1,address1,city1,state1,postalCode1,weight1,costPerOunce1)
    102. {
    103. extraCosts=extraCosts1;
    104. }
    105. //测试程序
    106. int main()
    107. {
    108. TwoDayPackage *ptr_Two=new TwoDayPackage("Lihua","Kandy","America","NewYork","NewYorkState",10041,30,5,36.2);
    109. OvernightPackage *ptr_Over=new OvernightPackage("Zhang shan","Kandy","America","Houston","Texas",77001,50,8,25.6);
    110. vector PackageClass;
    111. PackageClass.push_back(ptr_Two);
    112. PackageClass.push_back(ptr_Over);
    113. vector::iterator iter;
    114. for(iter = PackageClass.begin(); iter != PackageClass.end(); ++iter)
    115. {
    116. cout<<"该快递的具体信息如下:"<
    117. (*iter)->get();
    118. cout<<"该包裹的运输费用为: "<<(*iter)->calculateCost()<
    119. system("pause");
    120. system("cls");
    121. }
    122. cout<<"程序退出!"<
    123. delete ptr_Two;
    124. delete ptr_Over;
    125. return 0;
    126. }

  • 相关阅读:
    机器人过程自动化(RPA)入门 9. 管理和维护代码
    新的U-Net 网络结构
    OS--学习笔记:进程管理
    GAT解读graph attention network
    数据中台方案分析和发展方向
    有了数据中台,是否需要升级到数据飞轮?怎么做才能升级到数据飞轮?
    vuex为什么要存在?它与浏览器缓存的区别?
    2022最新Java高频面试集锦,让你“金九银十”轻松斩获大厂offer
    12小时,教室与生产线接力 复旦MBA科创青干营首个整合实践活动日
    linux上redis升级
  • 原文地址:https://blog.csdn.net/weixin_74287172/article/details/133175713