Class Declarations for BankAccount

class Account
{
public:
	enum {SAVINGS,CHECKING};
	static Account* create(Account *);
	virtual void read(istream &)=0;
	virtual void write(ostream & )=0;
	virtual void print()=0;
	virtual void deposit(double)=0;
	virtual void withdraw(double)=0;
private:
	virtual double computeInterest()=0;
	virtual Account* clone()=0;
};

typedef RcPointer < Account > AcctPtr;


class SavingsAccount :public Account
{
public:
	SavingsAccount();
	SavingsAccount(int id,double amount);
	virtual void read(istream &);
	virtual void write(ostream & );
	virtual void print();
	virtual void deposit(double);
	virtual void withdraw(double);
	int operator == (const SavingsAccount &)const;
	int operator == (int )const;//search for an existing account by number
private:
	virtual double computeInterest();
	virtual Account* clone();
	int _acctNumber;
	double _balance;
	static double _interestRate;
};
class CheckingAccount :public Account
{
public:
	CheckingAccount();
   	CheckingAccount(int, double);
	virtual void read(istream &);
	virtual void write(ostream & );
	virtual void print();
	virtual void deposit(double);
	virtual void withdraw(double);   
	int operator == (const CheckingAccount &)const;
	int operator == (int )const;//search for an existing account by number
private:
	virtual double computeInterest();
	virtual Account* clone();
	int _acctNumber;
	double _balance;
};

class AccountArray
{
public:
	AccountArray();
	void read();
	void write();
	void print();
	// other things not important for this example
private:
	Array < AcctPtr > accts;
};