第13章 类继承

来源:互联网 发布:设计美工的电脑配置 编辑:程序博客网 时间:2024/04/28 02:33

由于CSDN博客一直无法访问,导致博客一直没有更新!摔!

1.一个普通的类继承,包括构造函数传对象引用和参数列表初始化

头文件:
#ifndef TABLETENN1_H_#define TABLETENN1_H_#include<string>using namespace std;class TableTennisPlayer{private:    string firstname;    string lastname;    bool hasTable;public:    TableTennisPlayer(const string &fn="none",const string &ln="none",bool ht=false);    void Name()const;    bool HasTable()const    {        return hasTable;    }    void ResetTable(bool v)    {        hasTable=v;    }};class RatedPlayer:public TableTennisPlayer{private:    int rating;public:    RatedPlayer(int r=0,const string &fn="none",const string &ln="none",bool ht=false);    RatedPlayer(int r,const TableTennisPlayer &tp);    int Rating()const    { return rating;}    void ResetRating(int r)    { rating=r;}};#endif
函数实现:
#include<iostream>#include"tabtenn1.h"using namespace std;TableTennisPlayer::TableTennisPlayer(const string &fn,const string &ln,bool ht){    firstname=fn;    lastname=ln;    hasTable=ht;}void TableTennisPlayer::Name()const{    cout<<lastname<<", "<<firstname;}RatedPlayer::RatedPlayer(int r,const string &fn,const string &ln,bool ht){    TableTennisPlayer(fn,ln,ht);    rating=r;}RatedPlayer::RatedPlayer(int r, const TableTennisPlayer &tp):TableTennisPlayer(tp){    rating=r;}
函数调用:
#include<iostream>#include"tabtenn1.h"using namespace std;int main(){    TableTennisPlayer player1("Tara","Boomdea",false);    RatedPlayer rplayer1(1140,"Maloory","Duck",true);    rplayer1.Name();    if(rplayer1.HasTable())        cout<<" has a table!"<<endl;    else        cout<<" hasn't a table!"<<endl;    player1.Name();    if(player1.HasTable())        cout<<" has a table!"<<endl;    else        cout<<" hasn't a table!"<<endl;    cout<<"Name:";    rplayer1.Name();    cout<<";Rating: "<<rplayer1.Rating();    RatedPlayer rplayer2(1212,player1);    cout<<"Name: ";    rplayer2.Name();    cout<<";Rating: "<<rplayer2.Rating()<<endl;    return 0;}

2.虚函数和抽象基类(带有纯虚函数的基类)省去前面不带抽象基类的程序,直接写的完整版。

头文件:

#ifndef ACCTABC_H_#include<iostream>#include<string>using namespace std;class AcctABC{private:<span style="white-space:pre"></span>string fullname;<span style="white-space:pre"></span>long acctNum;<span style="white-space:pre"></span>double balance;protected:<span style="white-space:pre"></span>string &Fullname()<span style="white-space:pre"></span>{return fullname;}<span style="white-space:pre"></span>long AcctNum()<span style="white-space:pre"></span>{return acctNum;}public:<span style="white-space:pre"></span>AcctABC(const string &s="none",long an=-1,double bal=0.0);<span style="white-space:pre"></span>void Deposit(double amt);<span style="white-space:pre"></span>virtual void Withdraw(double amt)=0;<span style="white-space:pre"></span>double Balance()<span style="white-space:pre"></span>{return balance;}<span style="white-space:pre"></span>virtual void ViewAcct()=0;<span style="white-space:pre"></span>virtual ~AcctABC(){};};class Brass:public AcctABC{public:<span style="white-space:pre"></span>Brass(const string &s="none",long an=-1,double bal=0.0);//??    void Withdraw(double amt);           //基类中定义为了虚函数 子类不必在加virtual    void ViewAcct();    ~Brass(){};};class BrassPlus:public Brass{private:<span style="white-space:pre"></span>double maxLoan;<span style="white-space:pre"></span>double rate;<span style="white-space:pre"></span>double owesBank;public:<span style="white-space:pre"></span>BrassPlus(const string &s="none",long an=-1,double bal=0.0,double ml=500,double r=0.1);<span style="white-space:pre"></span>BrassPlus(const Brass &ba,double ml=500,double r=0.1);<span style="white-space:pre"></span> void Withdraw(double amt);         //基类中定义为了虚函数 子类不必在加virtual<span style="white-space:pre"></span> void ViewAcct();<span style="white-space:pre"></span>void RestMax(double m)<span style="white-space:pre"></span>{maxLoan=m;}<span style="white-space:pre"></span>void RestRate(double r)<span style="white-space:pre"></span>{rate=r;}<span style="white-space:pre"></span>void RestOwes()<span style="white-space:pre"></span>{owesBank=0;}};#endif
函数实现:
#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;}
函数调用:
#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()!='\n')        //  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!\n";        return 0;}

3.继承和动态内存分配

头文件:
#ifndef DMA_H_#define DMA_H_#include<iostream>using namespace std;   //俩个要一起用 有第二个必须要有第一个class baseDMA{private:char *label;int rating;public:baseDMA(char *l="none",int r=0);baseDMA(const baseDMA &rs);  //派生类继承后使用 baseDMA &operator=(const baseDMA &rs);friend ostream &operator<<(ostream &os,const baseDMA &b);~baseDMA();};class lackDMA:public baseDMA{private:enum{LEN=40};char color[LEN];public:lackDMA(char *l="none",int r=0,char *c="none");lackDMA(const baseDMA &b,char *c="none");friend ostream &operator<<(ostream &os,const lackDMA &l);};class hasDMA:public baseDMA{private:char *style;public:hasDMA(char *l="none",int r=0,char *s="none");hasDMA(const baseDMA &b,char *s);hasDMA(const hasDMA &rs);//可以使用baseDMA中的复制构造函数来复制共有的部分hasDMA &operator=(const hasDMA &rs);friend ostream &operator<<(ostream &os,const hasDMA &h);~hasDMA();};#endif

函数实现:
#include"dma.h"#include<cstring>#include<iostream>using namespace std;baseDMA::baseDMA(char *l,int r){//label=l;//错误!!!!label=new char[strlen(l)+1];strcpy(label,l);rating=r;}baseDMA::baseDMA(const baseDMA &rs){label=new char[strlen(rs.label)+1];strcpy(label,rs.label);rating=rs.rating;}baseDMA &baseDMA::operator=(const baseDMA &rs){if(this==&rs)return *this;delete []label;label=new char[strlen(rs.label)+1];strcpy(label,rs.label);rating=rs.rating;return *this;}ostream &operator<<(ostream &os,const baseDMA &b){os<<"label:"<<b.label<<endl;os<<"rating:"<<b.rating<<endl;return os;}baseDMA::~baseDMA(){delete[]label;}lackDMA::lackDMA(char *l,int r,char *c):baseDMA(l,r){strncpy(color,c,39);color[39]='\0';}lackDMA::lackDMA(const baseDMA &b,char *c):baseDMA(b)  //传入类型一定为baseDMA{strncpy(color,c,39);color[39]='\0';}ostream &operator<<(ostream &os,const lackDMA &l){os<<(const baseDMA &)l;//强制类型转换为基类 然后<<在基类中已经重载os<<"Color:"<<l.color<<endl;return os;}hasDMA::hasDMA(char *l,int r,char *s):baseDMA(l,r){style=new char[strlen(s)+1];strcpy(style,s);}hasDMA::hasDMA(const baseDMA &b,char *c):baseDMA(b){style=new char[strlen(c)+1];strcpy(style,c);}hasDMA::hasDMA(const hasDMA &rs):baseDMA(rs){style=new char[strlen(rs.style)+1];strcpy(style,rs.style);}hasDMA &hasDMA::operator=(const hasDMA &rs){if(this==&rs)return *this;baseDMA::operator=(rs);//使用基类已经重载的=来进行 共有部分 的赋值delete[] style;style=new char[strlen(rs.style)+1];strcpy(style,rs.style);return *this;}ostream &operator<<(ostream &os,const hasDMA &h){os<<(const baseDMA &)h;os<<"style:"<<h.style;return os;}hasDMA::~hasDMA(){delete[]style;}

函数调用:
#include<iostream>#include"dma.h"using namespace std;int main(){baseDMA shirt("Portable",8);lackDMA ballon("red",4,"Blimpo");hasDMA map("Mercator",5,"buffer");cout<<"Display baseDMA object:\n";cout<<shirt<<endl;cout<<"Display lackDMA object:\n";cout<<ballon<<endl;cout<<"Display hasDMA object:\n";cout<<map<<endl;lackDMA ballon2(ballon);cout<<"Result of lackDMA copy:\n";cout<<ballon2<<endl;hasDMA map2;map2=map;cout<<"result of hasDMA assignment:\n";cout<<map2<<endl;return 0;}




0 0
原创粉丝点击