zoukankan      html  css  js  c++  java
  • 第13章 类继承 --抽象基类

    包括贷款,虚函数,抽象基类。两个版本的最终版本。

    1.acctabc.h

    #ifndef ACCTABC_H_
    #include<iostream>
    #include<string>
    using namespace std;
    class AcctABC
    {
    private:
        string fullname;
        long acctNum;
        double balance;
    protected:
        string &Fullname()
        {return fullname;}
        long AcctNum()
        {return acctNum;}
    public:
        AcctABC(const string &s="none",long an=-1,double bal=0.0);
        void Deposit(double amt);
        virtual void Withdraw(double amt)=0;
        double Balance()
        {return balance;}
        virtual void ViewAcct()=0;
        virtual ~AcctABC(){};
    };
    class Brass:public AcctABC
    {
    public:
        Brass(const string &s="none",long an=-1,double bal=0.0);//??
        virtual void Withdraw(double amt);
        virtual void ViewAcct();
        virtual ~Brass(){};
    };
    class BrassPlus:public Brass
    {
    private:
        double maxLoan;
        double rate;
        double owesBank;
    public:
        BrassPlus(const string &s="none",long an=-1,double bal=0.0,double ml=500,double r=0.1);
        BrassPlus(const Brass &ba,double ml=500,double r=0.1);
        virtual void Withdraw(double amt);
        virtual void ViewAcct();
        void RestMax(double m)
        {maxLoan=m;}
        void RestRate(double r)
        {rate=r;}
        void RestOwes()
        {owesBank=0;}
    };
    #endif

    2.acctABC.cpp

    #include<iostream>
    #include"acctabc.h"
    using namespace std;
    AcctABC::AcctABC(const string &s,long an,double bal)   //在类的实现部分 不能有默认的参数值 否则会导致重定义
    {
        fullname=s;
        acctNum=an;
        balance=bal;
    }
    void AcctABC::Deposit(double amt)
    {
        balance=balance+amt;
    }
    void AcctABC::Withdraw(double amt)
    {
        balance-=amt;
    }
    
    
    Brass::Brass(const string &s,long an,double bal):AcctABC(s,an,bal) //在类的实现部分 不能有默认的参数值 否则会导致重定义
    {
    }
    void  Brass::Withdraw(double amt)
    {
        if(amt<=Balance())
            AcctABC::Withdraw(amt);
        else
            cout<<"exceeds your balance!"<<endl;
    }
    void Brass::ViewAcct()
    {
        cout<<"Brass Client:"<<Fullname()<<endl;
        cout<<"Account Number:"<<AcctNum()<<endl;
        cout<<"Balance :$"<<Balance()<<endl;
    }
    
    
    BrassPlus::BrassPlus(const string &s,long an,double bal,double ml,double r):Brass(s,an,bal) //在类的实现部分 不能有默认的参数值 否则会导致重定义
    {
        maxLoan=ml;
        rate=r;
        owesBank=0.0;
    }
    BrassPlus::BrassPlus(const Brass &ba,double ml,double r):Brass(ba)     //在类的实现部分 不能有默认的参数值 否则会导致重定义
    {
        maxLoan=ml;
        rate=r;
        owesBank=0.0;
    }
    void BrassPlus::Withdraw(double amt)
    {
        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!"<<endl;
    }
    void BrassPlus::ViewAcct()
    {
        Brass::ViewAcct();
        cout<<"<Max loan:$"<<maxLoan<<endl;
        cout<<"Owed to bank:$"<<owesBank<<endl;
        cout<<"Loan rate:"<<rate<<endl;
    }

    3.usebrass.cpp

    #include<iostream>
    #include<string>
    #include"acctabc.h"
    using namespace std;
    const int N=4;
    int main()
    {
        AcctABC *p[N];
        string tname;
        long tnum;
        double tbal;
        int kind;
        for(int i=0;i<N;i++)
        {
            cout<<"Enter name of #"<<i+1<<":";
            //getline(cin,tname);
            cin>>tname;
            cout<<"Enter number :";
            cin>>tnum;
            cout<<"Enter balance:";
            cin>>tbal;
            cout<<"Enter the type of client:";
            cin>>kind;
            while(kind!=1&&kind!=2)
            {    cout<<"type error!";
                cout<<"Enter the type of client:";
                cin>>kind;
            }
            if(kind==1)
            {
                p[i]= new Brass(tname,tnum,tbal); //用new 
            }
            else 
            {
                double trate;
                double tmax;
                cout<<"Enter the rate:";
                cin>>trate;
                cout<<"Enter the MaxLoan:";
                cin>>tmax;
                p[i]=new BrassPlus(tname,tnum,tbal,tmax,trate);
            }
        //    while (cin.get()!='
    ')
            //  continue;  后面的不合法输入在缓冲中的给清理掉,为下一次输入扫清障碍。还要明白一点cin.get()是不会忽略空格和回车的,
            //每次输入的最后你总是敲击enter以表明你的输入结束从而为上述语句总能处理成功提供保障。
        }
            for(int i=0;i<N;i++)
            {
                p[i]->ViewAcct();
                cout<<endl;
            }
            p[0]->Withdraw(1200);
            p[0]->ViewAcct();
            for(int i=0;i<N;i++)
            {
                delete p[i];
            }
            cout<<"Done!
    ";
            return 0;
    }
  • 相关阅读:
    FastStone Capture(FSCapture) 注册码
    Qt下开发及调用带界面的DLL
    Gin生成证书开启HTTPS
    Gin+Vue3开启nginx gzip但是不生效。
    GIn+Docker+docer-compose
    Go字符串切片
    Vue使用AG Grid嵌套element-plus
    GIN转换UTC时间
    GORM对实现datetime和date类型时间
    (二)PaddleOCR 编译 ocr_system.dll
  • 原文地址:https://www.cnblogs.com/yanlixin1993/p/4900147.html
Copyright © 2011-2022 走看看