实现多态共有继承的两种方法

1 在派生类中重新定义基类的方法

2 使用虚方法

P493程序清单13.7使用的方法为在派生类中重新定义基类的方法

brass.h

  1. #ifndef BRASS_H
  2. #define BRASS_H
  3. #include <string>
  4. class Brass{
  5. private:
  6. std::string fullName; //客户姓名
  7. long acctNum; //账号
  8. double balance; //当前结余
  9. public:
  10. Brass(const std::string & s="Nullbody",long an=-1,
  11. double bal=0.0);
  12. void Deposit(double amt); //存款
  13. virtual void withdraw(double amt); //取款
  14. double Balance() const; //显示余额
  15. virtual void ViewAcct() const;
  16. virtual ~Brass() {}
  17. };
  18. //Brass Plus Account Class
  19. class BrassPlus:public Brass
  20. {
  21. private:
  22. double maxLoan; //透支的上线
  23. double rate; //透支贷款利率
  24. double owesBank; //当前的透支额度
  25. public:
  26. BrassPlus(const std::string &s="Nullbody",long an=-1,
  27. double bal=0.0,double ml=500,double r=0.11125);
  28. BrassPlus(const Brass &ba,double ml=500,
  29. double r=0.11125);
  30. virtual void ViewAcct() const;
  31. virtual void withdraw(double amt);
  32. void ResetMax(double m){maxLoan=m;};
  33. void ResetRate(double r){rate=r;};
  34. void ResetOwes() {owesBank=0;};
  35. };
  36. #endif // BRASS_H

main.cpp

  1. #include <iostream>
  2. #include "brass.h"
  3. using namespace std;
  4. //formatting stuff
  5. typedef std::ios_base::fmtflags format;
  6. typedef std::streamsize precis;
  7. format setFormat();
  8. void restore(format f,precis p);
  9. //Brass methods
  10. Brass::Brass(const string &s, long an, double bal)
  11. {
  12. fullName=s;
  13. acctNum=an;
  14. balance=bal;
  15. }
  16. //储蓄函数
  17. void Brass::Deposit(double amt)
  18. {
  19. if(amt<0)
  20. {
  21. cout<<"Negative deposit not allowed;"
  22. <<"deposit is cancelled\n";
  23. }
  24. else
  25. balance=balance+amt;
  26. }
  27. void Brass::withdraw(double amt)
  28. {
  29. //set up ###.##format
  30. format initialState=setFormat();
  31. precis prec=cout.precision(2);
  32. if(amt<0)
  33. {
  34. cout<<"withdrawal amouut must be positive;"
  35. <<"withdrawal canceled\n";
  36. }
  37. else if(amt<=balance)
  38. {
  39. balance=balance-amt;
  40. }
  41. else
  42. {
  43. cout<<"withrdrawl amout of $"<<amt
  44. <<" exceeds your balance\n"
  45. <<"withdrawal canceled\n";
  46. }
  47. restore(initialState,prec);
  48. }
  49. double Brass::Balance() const
  50. {
  51. return balance;
  52. }
  53. void Brass::ViewAcct() const
  54. {
  55. //set up ###.## format
  56. format initialState=setFormat();
  57. precis prec=cout.precision(2);
  58. cout<<"Client:"<<fullName<<endl;
  59. cout<<"Account Number:"<<acctNum<<endl;
  60. cout<<"Balance:$"<<balance<<endl;
  61. restore(initialState,prec); //存储原始的格式
  62. }
  63. //BrassPlus的方法
  64. BrassPlus::BrassPlus(const string &s,
  65. long an, double bal,
  66. double ml, double r):Brass(s,an,bal)
  67. {
  68. //构造函数
  69. maxLoan=ml;
  70. owesBank=0.0;
  71. rate=r;
  72. }
  73. BrassPlus::BrassPlus(const Brass &ba, double ml, double r):Brass(ba)
  74. {
  75. maxLoan=ml;
  76. owesBank=0.0;
  77. rate=r;
  78. }
  79. //重定义
  80. void BrassPlus::ViewAcct() const
  81. {
  82. //set up ###.##format
  83. format initialState=setFormat();
  84. precis prec=cout.precision(2);
  85. Brass::ViewAcct(); //显示基类的部分
  86. cout<<"Maximum loan:$"<<maxLoan<<endl;
  87. cout<<"Owed to back:$"<<owesBank<<endl;
  88. cout.precision(3);
  89. cout<<"Loan Rate"<<100*rate<<"%\n";
  90. restore(initialState,prec);
  91. }
  92. //重定义
  93. //如果用户提取的金额超过了结余,该方法将安排贷款
  94. void BrassPlus::withdraw(double amt)
  95. {
  96. format initialState=setFormat();
  97. precis prec=cout.precision(2);
  98. //使用Balance()函数来确定结余
  99. double bal=Balance();
  100. if(amt<=bal)
  101. {
  102. //提款少于存款,提款成功
  103. Brass::withdraw(amt); //继承类中调用基类的方法
  104. }
  105. else if(amt<=bal+maxLoan-owesBank)
  106. {
  107. double advance=amt-bal;
  108. owesBank+=advance*(1.0+rate); //owesBank当前的透支额度
  109. cout<<"Bank advance:$"<<advance<<endl;
  110. cout<<"Finance charge:$"<<advance*rate<<endl;
  111. Deposit(advance); //放贷
  112. //放贷成功后可以今天提款
  113. Brass::withdraw(amt);
  114. }
  115. else
  116. {
  117. cout<<"Credit limit exceeded.Transaction cancelled.\n";
  118. }
  119. restore(initialState,prec);
  120. }
  121. format setFormat()
  122. {
  123. //set up ###.## format
  124. return cout.setf(std::ios_base::fixed,
  125. std::ios_base::floatfield);
  126. }
  127. void restore(format f, precis p)
  128. {
  129. cout.setf(f,std::ios_base::floatfield);
  130. cout.precision(p);
  131. }
  132. int main(int argc, char *argv[])
  133. {
  134. cout << "Hello World!" << endl;
  135. using std::cout;
  136. using std::endl;
  137. Brass Piggy("Procelot Pigg",381299,4000.00);
  138. BrassPlus Hoggy("Horatio Hogg",382288,3000.00);
  139. Piggy.ViewAcct();
  140. cout<<endl;
  141. Hoggy.ViewAcct();
  142. cout<<"Depositing $1000 into the Hogg Account:\n";
  143. Hoggy.Deposit(1000.00); //储蓄1000元到Hoggy的账户
  144. cout<<"New Balance:$"<<Hoggy.Balance()<<endl;
  145. cout<<"Withdrawing $4200 from the Pigg Account:\n";
  146. //取款失败,且不能借贷,因为Piggy是基类的对象,没有实现借贷的方法
  147. Piggy.withdraw(4200.00);
  148. cout<<"Pigg account balance:$"<<Piggy.Balance()<<endl;
  149. cout<<"Withdrwaing $42000 from the Hogg Account:\n";
  150. Hoggy.withdraw(4200.00);
  151. Hoggy.ViewAcct();
  152. return 0;
  153. }

运行结果如下



IDE为Qt Creator 4.0.3 (Community)

P493 brass的更多相关文章

  1. ruby 基础知识(二)

    ruby  中的动态方法 http://singleant.iteye.com/blog/1680382 Rails 大量使用了符号(symbol).符号看上去很像变量名,不过以冒号作为前缀.符号的例 ...

  2. 漫谈java重载与重写

    重载(Overloading):为了让方法名相同而形参不同的构造方法同时存在,让类以统一的方式处理不同类型数据的一种手段 重写(Overriding):导出类对继承自基类的方法做出一定的修改,又称方法 ...

  3. The Nine Indispensable Rules for HW/SW Debugging 软硬件调试之9条军规

    I read this book in the weekend, and decided to put the book on my nightstand. It's a short and funn ...

  4. Java-继承,多态练习09-22-01

    1.实现如下类之间的继承关系,并编写Music类来测试这些类. 父类: package com.lianxi; public class Instrument { //属性 private Strin ...

  5. 18.实现如下类之间的继承关系,并编写Music类来测试这些类。

    package zhongqiuzuoye; public class Instrument { public void play() { System.out.println("弹奏乐器& ...

  6. 实现如下类之间的继承关系,并编写Music类来测试这些类。

    实现如下类之间的继承关系,并编写Music类来测试这些类. package com.hanqi.test; public class Instrument { //输出弹奏乐器 public void ...

  7. JAVA语言学习笔记(一)

    1 一切都是对象 JAVA中所有代码都必须写在类里面. 方法名和参数列表(它们合起来被称为"方法签名")唯一地标识出某个方法.联想多态. 基本数据类型的"局部变量&quo ...

  8. MapReduce的模式、算法和用例

    英文原文:<MapReduce Patterns, Algorithms, and Use Cases> https://highlyscalable.wordpress.com/2012 ...

  9. GreenPlum简单性能测试与分析--续

    版权声明:本文由黄辉原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/259 来源:腾云阁 https://www.qclou ...

随机推荐

  1. Getting started with Kaggle -- Kaggle Competitions

    1: The Competition We'll be learning how to generate a submission for a Kaggle competition. Kaggle i ...

  2. 复制MIFARE Classic卡

    Mifare Classic 1K智能卡介绍及nfc-tools的使用 [原创]RFID安全之——ACR122U菜鸟初体验-『智能设备』-看雪安全论坛 复制MIFARE Classic小区门禁卡记录 ...

  3. MS08_067漏洞渗透攻击实践

    MS08_067漏洞渗透攻击实践 实验前准备 1.两台虚拟机,其中一台为kali,一台为windows xp sp3(英文版). 2.在VMware中设置两台虚拟机网络为NAT模式,自动分配IP地址, ...

  4. topcoder srm 315 div1

    problem1  link 直接模拟即可. import java.util.*; import java.math.*; import static java.lang.Math.*; publi ...

  5. C# 监控代码执行效率

    System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch(); stopwatch.Start(); stop ...

  6. C# 文件与二进制之间的转换

    /// <summary> /// 工具类:文件与二进制流间的转换 /// </summary> public class FileBinaryConvertHelper { ...

  7. Read.csv: some rows are missing

    read.csv in R doesn't import all rows from csv file The OP indicates that the problem is caused by q ...

  8. awk - group adjacent rows by identical columns

    Liang always brings me interesting quiz questions. Here is one: If i have a table like below: chr1 1 ...

  9. BZOJ5479: tree

    Description 给出一棵树,根节点为1 给出两个集合,集合由树上节点组成 从两个集合分别选出一个元素,求其LCA 问LCA的最大深度是多少 Input 第一行给出数据组数T 对于每组数据 第一 ...

  10. c#判断DatagridView表里是否有某个字段

    if (DatagridView.Columns.Contains("旧ID"))                {                   有             ...