1. 多态公有继承
派生类不能直接访问基类的私有数据,而必须使用基类的公有方法才能访问这些数据。访问的方式取决于方法。构造函数使用一种技术,而其他成员函数使用另一种技术。派生类构造函数在初始化基类私有数据时,采用的是成员初始化列表语法。非构造函数不能使用成员初始化列表语法,但派生类方法可以调用公有的基类方法。在派生类方法中,标准技术是使用作用域解析运算符来调用基类方法。
#pragma once
// brass.h -- bank account classes -- 13.7
#ifndef BRASS_H_
#define BRASS_H_
#include <string>
// Brass Account 支票账户信息
class Brass {
private:
std::string fullName; // 客户姓名
long acctNum; // 账号
double balance; // 当前结余
public:
Brass(const std::string& s = "Nullbody", long an = -1, double bal = 0.0); // 构造函数,创建账户
void Deposit(double amt); // 存款
virtual void Withdraw(double amt); // 取款
double Balance() const; // 显示余额
virtual void ViewAcct() const; // 显示账户信息
virtual ~Brass(){} // 析构函数
};
// Brass Plus Account 信息类
class BrassPlus : public Brass {
private:
double maxLoan; // 透支上限
double rate; // 透支贷款利率
double owesBank; // 当前的透支总额
public:
BrassPlus(const std::string& s = "Nullbody", long an = -1, double bal = 0.0, double ml = 500, double r = 0.11125);
BrassPlus(const Brass& ba, double ml = 500, double r = 0.11125);
virtual void ViewAcct() const; // 显示账户信息,需显示Brass Plus账户的其他信息
virtual void Withdraw(double amt); // 取款,需考虑透支保护
void ResetMax(double m) { maxLoan = m; } // 重置透支限额
void ResetRate(double r) { rate = r; } // 重置利率
void ResetOwes() { owesBank = 0; } // 重置欠款总额
};
#endif // !BRASS_H_
// brass.cpp -- bank account class methods
#include <iostream>
#include <string>
#include "brass.h"
using std::cin;
using std::cout;
using std::string;
using std::endl;
// formatting stuff
typedef std::ios_base::fmtflags format;
typedef std::streamsize precis;
format setFormat();
void restore(format f, precis p);
// Brass methods
Brass::Brass(const string& s, long an, double bal) {
fullName = s;
acctNum = an;
balance = bal;
}
void Brass::Deposit(double amt) {
if (amt < 0)
cout << "Negative deposit not allowed; deposit is cancelled.\n";
else
balance += amt;
}
void Brass::Withdraw(double amt) {
// set up ###.## format
format initialState = setFormat();
precis prec = cout.precision(2);
if (amt < 0)
cout << "Withdrawal amount must be positive; withdrawal canceled.\n";
else if (amt <= balance)
balance -= amt;
else
cout << "Withdrawal amoun