#include<iostream>
#include<cstring>
using std::cout;
using std::ios_base;
using std::endl;
#ifndef BRASS_H_
#define BRASS_H_
class Brass
{
private:
enum {MAX = 35};
char fullname[MAX];
long accNum;
double balance;
public:
Brass(const char* s="Nullbody",long an = -1, double bal=0.0);
void Deposit(double amt);
virtual void WithDraw(double amt);
double Balance() const;
virtual void ViewAcct() const;
virtual ~Brass(){}
};
class BrassPlus :public Brass
{
private:
double maxLoan;
double rate;
double owesBank;
public:
BrassPlus(const char* s="Nullbody", long an=-1,double bal = 0.0,double ml = 500,double r=0.10);
BrassPlus(const Brass &ba, double ml = 500 ,double r= 0.1);
virtual void ViewAcct() const;
virtual void WithDraw(double amt);
void ResetMax(double m) { maxLoan = m;}
void ResetRate(double r) { rate = r;}
void ResetOwes() { owesBank = 0;}
};
#endif
Brass::Brass(const char* s,long an, double bal)
{
std::strncpy(fullname,s,MAX-1);
fullname[MAX-1] = '\0';
accNum = an;
balance = bal;
}
void Brass::Deposit(double amt)
{
if(amt < 0 )
cout<<"Negative desposit not allowed:"
<<"desposit is cancelled.\n";
else
balance +=amt;
}
void Brass::WithDraw(double amt)
{
if(amt < 0 )
cout<<"Negative desposit not allowed:"
<<"desposit is cancelled.\n";
else if(amt <=balance)
balance -= amt;
else
cout<<"withdrawal amount of $"<<amt
<<"exceeds your balance.\n"
<<"withdrawal canceled.\n";
}
double Brass::Balance() const
{
return balance;
}
// 非构造函数不能使用成员初始化列表,但派生类方法可以调用公有的基类方法
void Brass::ViewAcct() const
{
//set up ###.## format
ios_base::fmtflags initialState = cout.setf(ios_base::fixed,ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
cout<<"Client:"<<fullname<<endl;
cout<<"Account Numver:"<<accNum<<endl;
cout<<"Balance:$"<<balance <<endl;
cout.setf(initialState);
}
BrassPlus::BrassPlus(const char* s,long an ,double bal,double ml ,double r):Brass(s,an,bal)
{
maxLoan =ml;
owesBank = 0.0;
rate = r;
}
BrassPlus::BrassPlus(const Brass &ba,double ml,double r):Brass(ba)
{
maxLoan = ml;
owesBank = 0.0;
rate = r;
}
void BrassPlus::ViewAcct() const
{
ios_base::fmtflags initialState = cout.setf(ios_base::fixed,ios_base::floatfield);
cout.setf(ios_base::showpoint);
Brass::ViewAcct(); //dispaly base portion
cout<<"Maxinum loam:$"<<maxLoan<<endl;
cout<<"Owed to Bank:$"<<owesBank<<endl;
cout<<"Loan Rate:"<<100 * rate <<"%\n";
cout.setf(initialState);
}
void BrassPlus::WithDraw(double amt)
{
//set up ###.## format
ios_base::fmtflags initialState = cout.setf(ios_base::fixed,ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
double bal = Balance();
if(amt <=bal)
Brass::WithDraw(amt); // 代码必须使用作用域解析操作符
else if(amt <= bal + maxLoan - owesBank)
{
double advance = amt - bal;
owesBank += advance *(1.0 + rate);
cout<<"Bank advance:$"<<advance<<endl;
cout<<"Finance charge:$"<<advance * rate <<endl;
Deposit(advance);
Brass::WithDraw(amt);
}
else
{
cout<<"Credit limit exceeded. transaction cancelled.\n";
}
cout.setf(initialState);
}
int main()
{
Brass piggy("porcelot pigg",3222233,111.00);
BrassPlus hoggy("hogg",3222333,3000.00);
piggy.ViewAcct();
cout<<endl;
hoggy.ViewAcct();
cout<<endl;
cout<<"Depositing $1000 into the hoggy accout:\n";
hoggy.Deposit(1000.00);
cout<<"new balance :$"<<hoggy.Balance()<<endl;
cout<<"WithDrawing $4200 from the pigg account:\n";
piggy.WithDraw(4200.00);
cout<<"pigg account balance :$"<<piggy.Balance()<<endl;
cout<<"with drawing $4200 from the hogg account.\n";
hoggy.WithDraw(4200.00);
hoggy.ViewAcct();
return 0;
}