//account.h
#pragma once
#include <iostream>
using namespace std;
class Account
{
public:
Account(void);
~Account(void);
Account(unsigned accNo,float balan = 0.0);
int AccountNo();
float AcntBalan();
static Account* First();
Account* Next();
static int NoAccounts();
void Display();
void Deposit(float amount);
//pure virtual function
virtual void Withdrawal(float amount) = 0;
protected:
static Account *pFirst;
Account *pNext;
static int count;
unsigned acntNumber;
float balance;
};
//account.cpp
#include "Account.h"
Account* Account::pFirst = (Account *)0;
int Account::count = 0;
Account::Account(void)
{
}
Account::~Account(void)
{
count--;
if (this == pFirst)
{
pFirst = this->pNext;
return ;
}
for (Account *pS = pFirst;pS;pS = pS->pNext)
{
if (pS->pNext == this)
{
pS->pNext = this->pNext;
return ;
}
}
}
Account ::Account(unsigned accNo,float balan /* = 0.0 */)
{
acntNumber = accNo;
balance = balan;
pNext = (Account *)0;
count++;
if (pFirst == NULL)
{
pFirst = this;//insert to empty link list
}
else
{
Account *pS = pFirst;
while (pS->pNext)//move to the last node
{
pS = pS->pNext;
}
pS->pNext = this;//inert this node
}
pNext = (Account *)0;//this node as the last node
}
int Account ::AccountNo()
{
return acntNumber;
}
float Account::AcntBalan()
{
return balance;
}
Account* Account::First()
{
return pFirst;
}
Account* Account::Next()
{
return pNext;
}
int Account::NoAccounts()
{
return count;
}
void Account::Display()
{
cout<<"Account number: "<<acntNumber
<<" = "<<balance<<endl;
}
void Account::Deposit(float amount)
{
balance += amount;
}
//checking.h
#pragma once
#include "account.h"
enum REMIT{remitByPost, remitByCable, other};
class Checking : public Account
{
public:
Checking(void);
~Checking(void);
Checking(unsigned accNo, float balan = 0.0);
void SetRemit(REMIT re);
virtual void Withdrawal(float amount);
protected:
REMIT remittance;
};
//checking.cpp
#include "Checking.h"
Checking::Checking(void)
{
}
Checking::~Checking(void)
{
}
Checking::Checking(unsigned accNo, float balan /* = 0.0 */):Account(accNo, balan)
{
remittance = other;
}
void Checking::SetRemit(REMIT re)
{
remittance = re;
}
void Checking::Withdrawal(float amount)
{
cout<<"call Checking fun"<<endl;
float temp = 0.0;
if (remittance == remitByPost)
{
temp = amount + 30;
}
else if (remittance == remitByCable)
{
temp = amount + 60;
}
if (balance < temp)
{
cout<<"Insufficient funds : balance "<<balance
<<", withdrawal "<<temp<<endl;
}
else
balance -= temp;
}
//saving.h
#pragma once
#include "account.h"
class Savings :
public Account
{
public:
Savings(void);
~Savings(void);
Savings(unsigned accNo, float balan = 0.0);
virtual void Withdrawal(float amount);
protected:
static float minBalance;
};
//savings.cpp
#include "Savings.h"
float Savings::minBalance = 500.0;
Savings::Savings(void)
{
}
Savings::~Savings(void)
{
}
Savings::Savings(unsigned int accNo, float balan):Account(accNo, balan){}
void Savings::Withdrawal(float amount)
{
cout<<"call Saving func"<<endl;
if (balance + minBalance < amount)
{
cout<<"Insufficient funds : balance "<<balance
<<", withdrawal " <<amount<<endl;
}
else
balance -= amount;
}
//main.cpp
#include "Checking.h"
#include "Savings.h"
void Func(Account* pA)
{
pA->Withdrawal(300.0);
}
int main()
{
Savings s(123,200.0);
Checking c(1234,200.0);
Func(&s);
Func(&c);
return 0;
}