使用Account类层次结构的多态的银行系统程序
使用创建过的Account类层次结构开发一个具有多态性的银行系统程序
创建过的类的链接
创建一个Account指针的vector对象,其中的指针指向SavingAccount对象和CheckingAccount对象。对于该vector对象中的每个Account,允许用户使用成员函数debit指定要从该Account取出的货币的金额,并允许用户使用成员函数credit指定要存入该Account的货币金额。处理每个Account时,应判定它的类型。如果Account是SavingAccount,就使用成员函数calculateInterest计算该Account应该得到的利息,然后使用成员函数credit把利息加到账户余额上。处理完一个Account后,通过调用基类成员函数getBalance打印更新后的账户余额。
完整代码
// Lab 1: Account.h
// Definition of Account class.
#ifndef ACCOUNT_H
#define ACCOUNT_H
class Account
{
public:
Account( double ); // constructor initializes balance
virtual void credit( double ); // add an amount to the account balance
virtual bool debit( double ); // subtract an amount from the balance
void setBalance( double ); // sets the account balance
double getBalance(); // return the account balance
private:
double balance; // data member that stores the balance
}; // end class Account
#endif
// Lab 1: Account.cpp
// Member-function definitions for class Account.
#include <iostream>
using std::cout;
using std::endl;
#include "Account.h" // include definition of class Account
// Account constructor initializes data member balance
Account::Account( double initialBalance )
{
// if initialBalance is greater than or equal to 0.0, set this value
// as the balance of the Account
if ( initialBalance >= 0.0 )
balance = initialBalance;
else // otherwise, output message and set balance to 0.0
{
cout << "Error: Initial balance cannot be negative." << endl;
balance = 0.0;
} // end if...else
} // end Account constructor
// credit (add) an amount to the account balance
void Account::credit( double amount )
{
balance = balance + amount; // add amount to balance
} // end function credit
// debit (subtract) an amount from the account balance
// return bool indicating whether money was debited
bool Account::debit( double amount )
{
if ( amount > balance ) // debit amount exceeds balance
{
cout << "Debit amount exceeded account balance." << endl;
return false;
} // end if
else // debit amount does not exceed balance
{
balance = balance - amount;
return true;
} // end else
} // end function debit
// set the account balance
void Account::setBalance( double newBalance )
{
balance = newBalance;
} // end function setBalance
// return the account balance
double Account::getBalance()
{
return balance;
} // end function getBalance
// Lab 1: SavingsAccount.h
// Definition of SavingsAccount class.
#ifndef SAVINGS_H
#define SAVINGS_H
#include "Account.h" // Account class definition
class SavingsAccount : public Account
{
public:
// constructor initializes balance and interest rate
SavingsAccount( double, double );
double calculateInterest(); // determine interest owed
private:
double interestRate; // interest rate (percentage) earned by account
}; // end class SavingsAccount
#endif
// Lab 1: SavingsAccount.cpp
// Member-function definitions for class SavingsAccount.
#include "SavingsAccount.h" // SavingsAccount class definition
// constructor initializes balance and interest rate
SavingsAccount::SavingsAccount( double initialBalance, double rate )
: Account( initialBalance ) // initialize base class
{
interestRate = ( rate < 0.0 ) ? 0.0 : rate; // set interestRate
} // end SavingsAccount constructor
// return the amount of interest earned
double SavingsAccount::calculateInterest()
{
return getBalance() * interestRate;
} // end function calculateInterest
// Lab 1: CheckingAccount.h
// Definition of CheckingAccount class.
#ifndef CHECKING_H
#define CHECKING_H
#include "Account.h" // Account class definition
class CheckingAccount : public Account
{
public:
// constructor initializes balance and transaction fee
CheckingAccount( double, double );
virtual void credit( double ); // redefined credit function
virtual bool debit( double ); // redefined debit function
private:
double transactionFee; // fee charged per transaction
// utility function to charge fee
void chargeFee();
}; // end class CheckingAccount
#endif
// Lab 1: CheckingAccount.cpp
// Member-function definitions for class CheckingAccount.
#include <iostream>
using std::cout;
using std::endl;
#include "CheckingAccount.h" // CheckingAccount class definition
// constructor initializes balance and transaction fee
CheckingAccount::CheckingAccount( double initialBalance, double fee )
: Account( initialBalance ) // initialize base class
{
transactionFee = ( fee < 0.0 ) ? 0.0 : fee; // set transaction fee
} // end CheckingAccount constructor
// credit (add) an amount to the account balance and charge fee
void CheckingAccount::credit( double amount )
{
Account::credit( amount ); // always succeeds
chargeFee();
} // end function credit
// debit (subtract) an amount from the account balance and charge fee
bool CheckingAccount::debit( double amount )
{
bool success = Account::debit( amount ); // attempt to debit
if ( success ) // if money was debited, charge fee and return true
{
chargeFee();
return true;
} // end if
else // otherwise, do not charge fee and return false
return false;
} // end function debit
// subtract transaction fee
void CheckingAccount::chargeFee()
{
Account::setBalance( getBalance() - transactionFee );
cout << "$" << transactionFee << " transaction fee charged." << endl;
} // end function chargeFee
// Lab 1: polymorphicBanking.cpp
// Processing Accounts polymorphically.
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
#include <iomanip>
using std::setprecision;
using std::fixed;
#include <vector>
using std::vector;
#include "Account.h" // Account class definition
#include "SavingsAccount.h" // SavingsAccount class definition
#include "CheckingAccount.h" // CheckingAccount class definition
int main()
{
// create vector accounts
vector < Account * > accounts( 4 );
// initialize vector with Accounts
accounts[ 0 ] = new SavingsAccount( 25.0, .03 );
accounts[ 1 ] = new CheckingAccount( 80.0, 1.0 );
accounts[ 2 ] = new SavingsAccount( 200.0, .015 );
accounts[ 3 ] = new CheckingAccount( 400.0, .5 );
cout << fixed << setprecision( 2 );
// loop through vector, prompting user for debit and credit amounts
for ( size_t i = 0; i < accounts.size(); i++ )
{
cout << "Account " << i + 1 << " balance: $"
<< accounts[ i ]->getBalance(); // Call the getBalance function through Account pointer i
double withdrawalAmount = 0.0;
cout << "\nEnter an amount to withdraw from Account " << i + 1
<< ": ";
cin >> withdrawalAmount;
accounts[ i ]->debit( withdrawalAmount ); //the debit function through Account pointer i
double depositAmount = 0.0;
cout << "Enter an amount to deposit into Account " << i + 1
<< ": ";
cin >> depositAmount;
accounts[ i ]->credit( depositAmount ); //the credit function through Account pointer i
// downcast pointer
SavingsAccount *savingsAccountPtr =
dynamic_cast < SavingsAccount * > ( accounts[ i ] );
// if Account is a SavingsAccount, calculate and add interest
if ( savingsAccountPtr != 0 ) //a test to determine if savingsAccountPtr isn't 0
{
double interestEarned = savingsAccountPtr->calculateInterest(); //member function calculateInterestthrough savingsAccountPtr
cout << "Adding $" << interestEarned << " interest to Account "
<< i + 1 << " (a SavingsAccount)" << endl;
savingsAccountPtr->credit( interestEarned ); //Use the credit function to credit interestEarned to the SavingsAccount pointed to by savingsAccountPtr
} // end if
cout << "Updated Account " << i + 1 << " balance: $"
<< accounts[ i ]->getBalance() //the getBalance function through Account pointer i
<< "\n\n";
} // end for
return 0;
} // end main
测试结果