C++ Primer Plus学习:第十三章 类继承(2)

继承
  类型
    公有继承
      派生类也是一个基类对象,可以对基类对象执行任何操作,也可以对派生类对象执行
    保护继承
    私有继承
多态
  多态仅有继承
    使用虚方法:在派生类中重新定义多态基类的方法
    为基类声明一个虚拟析构函数
  eg

    brass.h

#ifndef BRASS_H_
#define BRASS_H_

class Brass
{
      private:
              enum{MAX = 35};
              char fullName[MAX];
              long acctNum;
              double balance;
      public:
             Brass(const char *s = "NullBody",long an = 1,double bal = 0.0);
             void Deposit(double amt);
             //virtual 虚方法 
             virtual void Withdraw(double amt);
             double Balance()const;
             virtual void ViewAcct()const;
             virtual ~Brass();
      };
      
class BrassPlus:public Brass
{
      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


    brass.cpp

#include <iostream>
#include <cstring>
#include "brass.h"
using std::cout;
using std::ios_base;
using std::endl;

Brass::Brass(const char *s,long an,double bal)
{
                   std::strncpy(fullName,s,MAX-1);
                   fullName[MAX-1] = '\0';
                   acctNum = an;
                   balance = bal;
                   }
                   
void Brass::Deposit(double amt)
{
     if(amt < 0)
            cout<<"Negative deposit not allowed:"<<" deposit is cancelled.\n";
     else
         balance +=amt;
     }

Brass::~Brass()
{
     
     }

//define Withdraw()
void Brass::Withdraw(double amt)
{
     if(amt < 0)
            cout<<"Withdrawal amout must be positive:"<<" withdrawal canceled.\n";
     else if(amt <= balance)
          balance -= amt;
     else
         cout<<"Withdrawal amout of {1}quot;<<amt<<" exceeds your balance.\n"<<"Withdrawal canceled.\n";
     }
     
double Brass::Balance()const
{
       return balance;
       }

void Brass::ViewAcct()const
{
     //set up ###.##
     ios_base::fmtflags inititalState = cout.setf(ios_base::fixed,ios_base::floatfield);
     cout.setf(ios_base::showpoint);
     cout.precision(2);
     cout<<"Client: "<<fullName<<endl;
     cout<<"Account Number: "<<acctNum<<endl;
     cout<<"Balance:{1}quot;<<balance<<endl;
     cout.setf(inititalState);
     }

//BrassPlus method
BrassPlus::BrassPlus(const char *s,long an,double bal,double ml,double r):Brass(s,an,bal)
{
                           maxLoan = ml;
                           owesBank = 0.0;
                           rate = r;
                           }
                           
BrassPlus::BrassPlus(const Brass &ba,double ml,double r):Brass(ba)
{
                           maxLoan = ml;
                           owesBank = 0.0;
                           rate = r;
                           }
                           
//redefine how ViewAcct() work
void BrassPlus::ViewAcct()const
{
          //set up ###.##
     ios_base::fmtflags inititalState = cout.setf(ios_base::fixed,ios_base::floatfield);
     cout.setf(ios_base::showpoint);
     cout.precision(2);
     
     Brass::ViewAcct(); //display Brass::ViewAcct()
     cout<<"Maximum loan:{1}quot;<<maxLoan<<endl;
     cout<<"Owed to bank:{1}quot;<<owesBank<<endl;
     cout<<"Loan Rate:"<<100*rate<<"%"<<endl;
     cout.setf(inititalState);
     }
     
//redefine how WithDraw()
void BrassPlus::Withdraw(double amt)
{
     //set up ###.##
     ios_base::fmtflags inititalState = cout.setf(ios_base::fixed,ios_base::floatfield);
     cout.setf(ios_base::showpoint);
     cout.precision(2);
     
     double bal = Balance();
     if(amt <= bal)
            Brass::Withdraw(amt);
     else if(amt <= bal+maxLoan-owesBank)
     {
          double advance = amt - bal;
          owesBank +=advance*(1.0 + rate);
          cout<<"Bank advance:{1}quot;<<advance<<endl;
          cout<<"Finance charge:{1}quot;<<advance*rate<<endl;
          Deposit(advance);
          Brass::Withdraw(amt);
          }
     else
         cout<<"Credit limit exceeded.Transaction cancelled.\n";
     cout.setf(inititalState);
     }


    usebrass2.cpp

#include <iostream>
#include "brass.h"

const int CLIENTS = 4;
const int LEN = 40;

int main()
{
    using std::cin;
    using std::cout;
    using std::endl;
    
    //指针表达Brass与BrassPlus 
    Brass * p_clients[CLIENTS];
    
    int i;
    for(i = 0;i<CLIENTS;i++)
    {
          char temp[LEN];
          long tempnum;
          double tempbal;
          char kind;
          cout<<"Enter client's name:";
          cin.getline(temp,LEN);
          cout<<"Enter client's account number:";
          cin>>tempnum;
          cout<<"Enter opening balance:{1}quot;;
          cin>>tempbal;
          cout<<"Enter 1 for Brass Account or 2 for BrassPlus Account: ";
          while(cin>>kind && (kind!='1' && kind != '2'))
                          cout<<"Enter either 1 or 2";
          if(kind == '1')
                  //p_clients构造Brass类对象 
                  p_clients[i] = new Brass(temp,tempnum,tempbal);
          else
          {
              double tmax,trate;
              cout<<"Enter the interest rate as a decimal fraction: ";
              cin>>trate;
              //p_client构造BrassPlus类对象 
              p_clients[i] = new BrassPlus(temp,tempnum,tempbal,tmax,trate);
              }
          while(cin.get()!='\n')
                                continue;
          }
    cout<<endl;
    for(i=0;i<CLIENTS;i++)
    {
                          p_clients[i]->ViewAcct();
                          cout<<endl;
                          }
                          
    for(i = 0;i<CLIENTS;i++)
    {
          delete p_clients[i];
          }
    cout<<"Done!\n";
    
    system("pause");
    return 0;
    }


虚函数
  在基类方法中场景中使用virtual的相关方法,在所有的派生类中都是虚拟的
  如果使用指向对象的引用或指针来调用虚方法,程序将使用为对象类型定义的方法,而不使用为引用或者指针类型定义的方法。仅与对象类型有关
  如果定义的类将被用作基类,则应将派生类中重新定义的方法声明为虚拟的
Note
  如果在要派生类中重新定义基类的方法,则将它设置为虚方法;否则设置为非虚方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值