C++ 抽象类
#ifndef PRO1_ACCTABC_H#define PRO1_ACCTABC_H#include <iostream>#include <cstring>using namespace std;// Abstract Base Classclass AcctABC {private:    enum {MAX = 35};    char fullName[MAX];    long acctNum;    double balance;protected:    const char * FullName()const { return fullName; }    long AcctNum()const { return acctNum; }    ios_base::fmtflags SetFormat()const ;public:    AcctABC(const char *s = "Nullbody", long an = -1, double bal = 0.0);    void Deposit(double amt);    virtual void Withdraw(double amt) = 0;    double Balance()const { return balance; };    virtual void ViewAcct()const = 0;    virtual ~AcctABC(){};};class Brass: public AcctABC{public:    Brass(const char*s = "Nullbody", long an = -1, double bal = 0.0);    virtual void Withdraw(double amt);    virtual void ViewAcct()const ;    virtual ~Brass();};class BrassPlus: public AcctABC{private:    double maxLoan;    double rate;    double owesBank;public:    BrassPlus(const char *s = "Nullbody", long an = -1, double bal = 0.0, double ml = 500, double r = 0.10);    BrassPlus(const Brass & ba, double ml = 500, double r = 0.1);    virtual void ViewAcct()const ;    virtual void Withdraw(double amt);    void ResetMax(double m){ maxLoan = m; }    void ResetRate(double r){ rate = r; }    void ResetOwes(){ owesBank = 0; }};#endif //PRO1_ACCTABC_H
#include "acctabc.h"#include <iostream>#include <cstring>using namespace std;AcctABC::AcctABC(const char *s, long an, double bal) {    strncpy(fullName, s, MAX - 1);    fullName[MAX - 1] = '\0';    acctNum = an;    balance = bal;}void AcctABC::Deposit(double amt) {    if (amt < 0)        cout << "Negative deposit not allowed: " << "deposit is cancelled.\n";    else        balance -=amt;}void AcctABC::Withdraw(double amt) {    balance -= amt;}ios_base::fmtflags AcctABC::SetFormat() const {    ios_base::fmtflags initialState = cout.setf(ios_base::fixed, ios_base::floatfield);    cout.setf(ios_base::showpoint);    cout.precision(2);    return initialState;}void Brass::Withdraw(double amt) {    if (amt < 0)        cout << "Withdrawal; amount must be positive;" << "withdrawal canceled.\n";    else if (amt <= Balance())        AcctABC::Withdraw(amt);    else        cout << "Withdrawal amount of $" << amt << " exceeds your balance.\n" << "Withdrawal canceled.\n";}void Brass::ViewAcct() const {    ios_base::fmtflags initialState = SetFormat();    cout << "Brass Client: " << FullName() << endl;    cout << "Account Number: " << AcctNum() << endl;    cout << "Balance: $ " << Balance() << endl;    cout.setf(initialState);}BrassPlus::BrassPlus(const char *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() const {    ios_base::fmtflags initialState = SetFormat();    cout << "BrassPlus Client: " << FullName() << endl;    cout << "Account Number: " << AcctNum() << endl;    cout << "Balance: $ " << Balance() << endl;    cout << "Maximum loan: $ " << maxLoan << endl;    cout << "Owed to Bank: $ " << owesBank << endl;    cout << "Loan Rate: " << 100 * rate << endl;    cout.setf(initialState);}void BrassPlus::Withdraw(double amt) {    ios_base::fmtflags initialState = 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 << endl;        cout << "Finance charge: $ " << advance * rate << endl;        Deposit(advance);        AcctABC::Withdraw(amt);    } else        cout << "Credit limit exceeded. Transaction cancelled.\n";    cout.setf(initialState);}