C++ 支票账户(虚函数与多态)

题目描述
某银行的支票账户分为两类,一类为基本支票账户BaseAccount,另一类为具有透支保护特性的BasePlus支票账户。

BaseAccount支票账户的信息包括:客户姓名(name)、账户(account)、当前结余(balance);
BaseAccount支票账户可以执行的操作包括:存款(deposit)、取款(withdraw)、显示账户信息(display)。注意:取款金额不能透支,否则显式出错信息“insufficient”。

BasePlus支票账户除包含BaseAccount的所有信息外,还包括以下信息:透支上限(limit:默认为5000),当前透支总额(limit_sum);
BasePlus支票账户可执行的操作与BaseAccount相同,但有两种操作的实现不同:
(1)对于取款操作,可以在透支上限范围内透支,超过则显示出错信息“insufficient”;
(2)对于显示操作,必须显示BasePlus的其他信息。

请实现BaseAccount类和BasePlus类,其中BasePlus类继承于BaseAccount类,注意BaseAccount账户名称以BA开头,BasePlus账户名称以BP开头。

要求只使用一个基类指针,指向所建立的对象,然后使用指针调用类中的方法。

输入
测试案例组数 t

第一组测试数据:

第一行输入账户信息:姓名 帐号 当前余额

第二行输入四个整数,表示对账户按顺序存款、取款、存款、取款

第二组测试数据:

输出
输出BaseAccount的信息

输出BasePlus的信息

样例输入
4
Tom BA008 1000
1000 2000 1000 1200
Bob BP009 1000 1000 2000
1000 7000
May BA001 2000
500 1000 500 1000
Lily BP002 1000
500 2000 500 3000
样例输出
insufficient
Tom BA008 Balance:1000
insufficient
Bob BP009 Balance:1000 limit:5000
May BA001 Balance:1000
Lily BP002 Balance:0 limit:2000

#include<iostream>
#include <cstring>
using namespace std;
class BaseAccount{
	protected:
		char *name;
		char *account;
		int balance;
	public:
		BaseAccount(char *n,char *a,int b):balance(b){
			name=new char[strlen(n)+1];
			strcpy(name,n);
			account=new char[strlen(a)+1];
			strcpy(account,a);
		}
		void deposit(int d){
			balance+=d;
		}	
		virtual void withdraw(int w){
			if(balance-w>=0)
				balance-=w;
			else
				cout<<"insufficient"<<endl;
		}
		virtual void print(){
			cout<<name<<" "<<account<<" Balance:"<<balance<<endl;
		}
		virtual ~BaseAccount(){
			if(name!=NULL)
				delete name;
			if(account!=NULL)
				delete account;
		}
};
class BasePlus:public BaseAccount{
	protected:
		int limit;
		int limit_sum;
	public:
		BasePlus(char *n,char *a,int b):BaseAccount(n,a,b){
			limit=5000;
			limit_sum=0;
		}
		virtual void withdraw(int w){
			if(balance-w>=-5000){
				balance-=w;
				if(balance<0){ 
				limit=5000+balance; 	//还可以透支的钱为limit 
				limit_sum=balance;		//当前已经透支的钱 
				}		
			}	
			else
				cout<<"insufficient"<<endl;
		}
		virtual void print(){
			cout<<name<<" "<<account;
			if(balance<0)
			cout<<" Balance:0";
			else
			cout<<" Balance:"<<balance;
			cout<<" limit:"<<limit<<endl;
		}
};
int main(){
	int t,b,d,w;
	char n[20],a[20];
	cin>>t;
	BaseAccount *p; 	//定义一个基类指针 
	while(t--){
		cin>>n>>a>>b;
		if(a[1]=='A'){
			BaseAccount b1(n,a,b);
				cin>>d>>w;
			p=&b1;		//按照题目要求使用指针进行调用类中的方法 
			p->deposit(d);
			p->withdraw(w);
			cin>>d>>w;
			p->deposit(d);
			p->withdraw(w);
			p->print();
		}
		else{
			BasePlus b1(n,a,b);
			cin>>d>>w;
			p=&b1;		//按照题目要求使用指针进行调用类中的方法 
			p->deposit(d);
			p->withdraw(w);
			cin>>d>>w;
			p->deposit(d);
			p->withdraw(w);
			p->print();
		}	
	}
} 

在这里插入图片描述

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值