抽象基类(ABC),纯虚函数
- #ifndef _ACCTABC_H_
- #define _ACCTABC_H_
- //(*
- #include <iostream>
- #include <string>
- //*)
- //Abstract Base Class
- class AcctABC
- {
- private:
- std::string fullName;
- long acctNum;
- double balance;
- protected:
- struct Formatting
- {
- std::ios_base::fmtflags flag;
- std::streamsize pr;
- };
- const std::string & FullName(void) const {return fullName;}
- long AcctNum(void) const {return acctNum;}
- Formatting SetFormat(void) const;
- void Restore(Formatting & f) const;
- public:
- AcctABC(const std::string & s = "Nullbody", long an = -, double bal = 0.0);
- void Deposit(double amt);
- virtual void Withdraw(double amt) = ; //pure virtual function
- double Balance(void) const {return balance;};
- virtual void ViewAcct(void) const = ; //pure virtual function
- virtual ~AcctABC() {}
- };
- //Brass Account Class
- class Brass : public AcctABC
- {
- public:
- Brass(const std::string & s = "Nullbody", long an = -, double bal = 0.0) : AcctABC(s, an, bal) {}
- virtual void Withdraw(double amt);
- virtual void ViewAcct(void) const;
- virtual ~Brass() {}
- };
- //Brass Plus Account Class
- class BrassPlus : public AcctABC
- {
- private:
- double maxLoan;
- double rate;
- double owesBank;
- public:
- BrassPlus(const std::string & s = "Nullbodt", long an = -, double bal = 0.0, double ml = , double r = 0.10);
- BrassPlus(const Brass & ba, double ml = , double r = 0.1);
- virtual void ViewAcct(void) const;
- virtual void Withdraw(double amt);
- void ResetMax(double m) {maxLoan = m;}
- void ResetRate(double r) {rate = r;}
- void ResetOwes(void) {owesBank = ;}
- };
- #endif
- #include <iostream>
- #include "acctabc.h"
- using std::cout;
- using std::ios_base;
- using std::endl;
- using std::string;
- //Abstract Base class
- AcctABC::AcctABC(const string & s, long an, double bal)
- {
- fullName = s;
- acctNum = an;
- balance = bal;
- }
- void AcctABC::Deposit(double amt)
- {
- if(amt < )
- {
- cout << "Negative deposit not allowed; deposit is cancelled." << endl;
- }
- else
- {
- balance += amt;
- }
- }
- void AcctABC::Withdraw(double amt)
- {
- balance -= amt;
- }
- //protected methods for formatting
- AcctABC::Formatting AcctABC::SetFormat(void) const
- {
- //set up ###.## format
- Formatting f;
- f.flag = cout.setf(ios_base::fixed, ios_base::floatfield);
- f.pr = cout.precision();
- return f;
- }
- void AcctABC::Restore(Formatting & f) const
- {
- cout.setf(f.flag, ios_base::floatfield);
- cout.precision(f.pr);
- }
- //Brass methods
- void Brass::Withdraw(double amt)
- {
- if(amt < )
- {
- cout << "Withdrawal amount must be positive; withdrawal canceled." << endl;
- }
- else if(amt < Balance())
- {
- AcctABC::Withdraw(amt);
- }
- else
- {
- cout << "Withdrawal amount of $" << amt << " exceeds your balance." << endl << "Withdrawal canceled." << endl;
- }
- }
- void Brass::ViewAcct(void) const
- {
- Formatting f = SetFormat();
- cout << "Brass Client: " << FullName() << endl;
- cout << "Account Number: " << AcctNum() << endl;
- cout << "Balance: $" << Balance() << endl;
- Restore(f);
- }
- //BrassPlus Methods
- BrassPlus::BrassPlus(const string & s, long an, double bal, double ml, double r) : AcctABC(s, an, bal)
- {
- maxLoan = ml;
- owesBank = 0.0;
- rate = r;
- }
- BrassPlus::BrassPlus(const Brass & ba, double ml, double r) : AcctABC(ba)
- {
- maxLoan = ml;
- owesBank = 0.0;
- rate = r;
- }
- void BrassPlus::ViewAcct(void) const
- {
- Formatting f = SetFormat();
- cout << "BrassPlus Client: " << FullName() << endl;
- cout << "Account Number: " << AcctNum() << endl;
- cout << "Balance: $" << Balance() << endl;
- cout << "Maxinum loan: $" << maxLoan <<endl;
- cout << "Owed to bank: $" << owesBank << endl;
- cout.precision();
- cout << "Loan Rate: " << * rate << "%\n";
- Restore(f);
- }
- void BrassPlus::Withdraw(double amt)
- {
- Formatting f = SetFormat();
- double bal = Balance();
- if(amt <= bal)
- {
- AcctABC::Withdraw(amt);
- }
- else if(amt <= bal + maxLoan - owesBank)
- {
- double advance = amt - bal;
- owesBank += advance * (1.0 + rate);
- cout << "Bank advance: $" << advance * rate << endl;
- Deposit(advance);
- AcctABC::Withdraw(amt);
- }
- else
- {
- cout << "Credit limit exceeded. Transaction cancelled." << endl;
- }
- Restore(f);
- }
- #include <iostream>
- #include <string>
- #include "acctabc.h"
- const int CLIENTS = ;
- int main(void)
- {
- using std::cin;
- using std::cout;
- using std::endl;
- AcctABC * p_clients[CLIENTS];
- std::string temp;
- long tempnum;
- double tempbal;
- char kind;
- for(int i = ; i < CLIENTS; i++)
- {
- cout << "Enter client's name: ";
- getline(cin, temp);
- cout << "Enter client's account number: ";
- cin >> tempnum;
- cout << "Enter opening balance: $";
- cin >> tempbal;
- cout << "Enter 1 for Brass Account or 2 for BrassPlus Account: ";
- while(cin >> kind && (kind != '' && kind != ''))
- {
- cout << "Enter either 1 or 2: ";
- }
- if(kind == '')
- {
- p_clients[i] = new Brass(temp, tempnum, tempbal);
- }
- else
- {
- double tmax, trate;
- cout << "Enter the overdraft limit: $";
- cin >> tmax;
- cout << "Enter the interest rate " << "as a decimal fraction: ";
- cin >> trate;
- p_clients[i] = new BrassPlus(temp, tempnum, tempbal, tmax, trate);
- }
- while(cin.get() != '\n')
- {
- continue;
- }
- }
- cout << endl;
- for(int i = ; i < CLIENTS; i++)
- {
- p_clients[i]->ViewAcct();
- cout << endl;
- }
- for(int i = ; i < CLIENTS; i++)
- {
- delete p_clients[i];
- }
- cout << "DONE.\n";
- return ;
- }
抽象基类(ABC),纯虚函数的更多相关文章
- C++:抽象基类和纯虚函数的理解
转载地址:http://blog.csdn.net/acs713/article/details/7352440 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ...
- (转)(C++)关于抽象基类和纯虚函数
★抽象类:一个类可以抽象出不同的对象来表达一个抽象的概念和通用的接口,这个类不能实例化(创造)对象. ★纯虚函数(pure virtual):在本类里不能有实现(描述功能),实现需要在子类中实现.例: ...
- 4.6 C++抽象基类和纯虚成员函数
参考:http://www.weixueyuan.net/view/6376.html 总结: 在C++中,可以通过抽象基类来实现公共接口 纯虚成员函数没有函数体,只有函数声明,在纯虚函数声明结尾加上 ...
- C++入门经典-例8.9-抽象类,纯虚函数,创建纯虚函数
1:包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数.抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针.在程序开发过程中并 ...
- C++基础知识 基类指针、虚函数、多态性、纯虚函数、虚析构
一.基类指针.派生类指针 父类指针可以new一个子类对象 二.虚函数 有没有一个解决方法,使我们只定义一个对象指针,就可以调用父类,以及各个子类的同名函数? 有解决方案,这个对象指针必须是一个父类类型 ...
- OOP2(虚函数/抽象基类/访问控制与继承)
通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当 ...
- C++纯虚函数
本文较为深入的分析了C++中虚函数与纯虚函数的用法,对于学习和掌握面向对象程序设计来说是至关重要的.具体内容如下: 首先,面向对象程序设计(object-oriented programming)的核 ...
- c/c++ 基金会(七) 功能覆盖,虚函数,纯虚函数控制
1.功能覆盖 ClassA , ClassB ,其中ClassB继承ClassA 类的定义如下面的: #ifndef _CLASSA_H #define _CLASSA_H #include < ...
- C++ 虚函数 、纯虚函数、接口的实用方法和意义
也许之前我很少写代码,更很少写面向对象的代码,即使有写多半也很容易写回到面向过程的老路上去.在写面向过程的代码的时候,根本不管什么函数重载和覆盖,想到要什么功能就变得法子的换个函数名字,心里想想:反正 ...
随机推荐
- java的通信机制
通信机制无非就那几种:http访问.socket访问: http又分为:jsp.servlet.html,用的就是get和post方法 socket则可分为:tcp或者udp方式 从以上内容又衍生出其 ...
- POJ题目细究
acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP: 1011 NTA 简单题 1013 Great Equipment 简单题 102 ...
- 对require.js 的使用进行总结
一.为什么要使用require.js 首先一个页面如果在加载多个js文件的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长:其次,由于js文件之间存在依赖关系,因此必须严格保证加载 ...
- 表达式:使用API创建表达式树(1)
表达式树可使用Expressions类的静态工厂方法来创建.这种用API的方式创建给予我们在编程极大的灵活性,MSDN上关于表达式的例子也不少,但在使用过程中还是会遇到许多麻烦,对有的表达式类,介绍得 ...
- (转)PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
在看帝国cms的connect.php是发现第一句是error_reporting(E_ALL ^ E_NOTICE);以前也没注意过这个语句,知道是设置错误提示的,但不清楚具体怎样设置使用.下面从网 ...
- [转帖]AVS音视频编解码技术了解
AVS高清立体视频编码器 电视技术在经历了从黑白到彩色.从模拟到数字的技术变革之后正在酝酿另一场技术革命,从单纯观看二维场景的平面电视跨越到展现三维场景的立体电视3DTV.3DTV系统的核心问题之一是 ...
- MySQL 管理
MySQL 管理 启动及关闭 MySQL 服务器 首先,我们需要通过以下命令来检查MySQL服务器是否启动: ps -ef | grep mysqld 如果MySql已经启动,以上命令将输出mysql ...
- javascript 常用array类型方法
concat:基于当前数组中的所有项创建一个新数据,会创建当前数组一个副本,然后将接受到的参数放到数组末尾,最后返回新数组.如果没有参数,则复制当前数组并返回副本. slice:基于当前数组中一个或多 ...
- window.clearInterval与window.setInterval的用法 定时器的设置
window.setInterval() 功能:按照指定的周期(以毫秒计)来调用函数或计算表达式. 语法:setInterval(code,millisec) code:在指定时间到时要执行的Java ...
- mongoDB之用户及权限设置
之前用MongoDB没有设置用户和权限,一直都是本机应用程序连接MongoDB.在服务器上部署后对外没有开数据库连接端口,本机应用程序连接再开放应用程序端口供外部访问. 我部署的环境是ubuntu 1 ...