C++ 第五次實驗

實驗5 多態性與虛函數

實驗步驟:
第一步:

#include<iostream>
#include<cstdlib>
using namespace std;
class Rational
{
private:
    //定義一個有理數num爲分母,den爲分子
    long num,den;
public:
    //構造函數
    Rational(int num=0,int denom=1);
    //重載比較操作符
    int operator<(Rational r) const;
    int operator<=(Rational r) const;
    int operator==(Rational r) const;
    int operator!=(Rational r) const;
};
Rational::Rational(int p,int q):num(p),den(q)
{
    if(den==0)
    {
        cout<<"A Zero denominator is invalid"<<endl;
        exit(1);
    }
}
//重載“小於”
int Rational::operator<(Rational r) const
{
    return num*r.den<r.num*den;
}
//重載“小於等於”
int Rational::operator<=(Rational r) const
{
    return num*r.den<=r.num*den;
}
//重載“相等”
int Rational::operator==(Rational r) const
{
    return num*r.den==r.num*den;
}
//重載“不相等”
int Rational::operator!=(Rational r) const
{
    return num*r.den!=r.num*den;
}
int main()
{
    Rational a(2,3),b(3,4);
    if(a<b) cout<<"\na<b";
    else cout<<"\na>b";
    return 0;
}

第二步:Animal類的調試。

#include<iostream>
#include<cstring>
using namespace std;
class Animal{
protected:
    char *name;
public:
    Animal()
    {
        name=NULL;
    }
    Animal(char *n);
    ~Animal() {delete name;}
    virtual void Identify();
};
Animal::Animal(char *n)
{
    name=new char[strlen(n)+1];
    strcpy(name,n);
}
void Animal::Identify()
{
    cout<<"\ngeneric animal";
}
int main()
{
    Animal a(" ");
    a.Identify();
    return 0;
}

第三步:Cat和Dog類的調試。

#include<iostream>
#include<cstring>
using namespace std;
class Animal{
protected:
    char *name;
public:
    Animal()
    {
        name=NULL;
    }
    Animal(char *n);
    ~Animal() {delete name;}
    virtual void Identify();
};
class Cat:public Animal{
public:
    Cat():Animal(){};
    Cat(char *n):Animal(n){};
    void Identify();
};
class Dog:public Animal{
public:
    Dog():Animal(){};
    Dog(char *n):Animal(n){};
    void Identify();
};
Animal::Animal(char *n)
{
    name=new char[strlen(n)+1];
    strcpy(name,n);
}
void Animal::Identify()
{
    cout<<"\ngeneric aninal";
}
void Cat::Identify()
{
    cout<<"\nI am a cat named "<<name<<endl;
}
void Dog::Identify()
{
    cout<<"\nI am a dog named "<<name<<endl;
}
int main()
{
    Cat cat("Herry");
    cat.Identify();
    Dog dog("Jimmy");
    dog.Identify();
    return 0;
}

第四步:Tiger類的調試,Tiger類繼承了Cat類。

#include<iostream>
#include<cstring>
using namespace std;
class Animal{
protected:
    char *name;
public:
    Animal()
    {
        name=NULL;
    }
    Animal(char *n);
    ~Animal() {delete name;}
    virtual void Identify();
};
class Cat:public Animal{
public:
    Cat():Animal(){};
    Cat(char *n):Animal(n){};
    void Identify();
};
class Tiger:public Cat{
public:
    Tiger():Cat(){};
    Tiger(char *n):Cat(n){};
    void Identify();
};
class Dog:public Animal{
public:
    Dog():Animal(){};
    Dog(char *n):Animal(n){};
    void Identify();
};
Animal::Animal(char *n)
{
    name=new char[strlen(n)+1];
    strcpy(name,n);
}
void Animal::Identify()
{
    cout<<"\ngeneric aninal";
}
void Cat::Identify()
{
    cout<<"\nI am a cat named "<<name<<endl;
}
void Tiger::Identify()
{
    cout<<"\nI am a tiger named "<<name<<endl;
}
void Dog::Identify()
{
    cout<<"\nI am a dog named "<<name<<endl;
}
int main()
{
    Cat cat("Herry");
    cat.Identify();
    Dog dog("Jimmy");
    dog.Identify();
    Tiger tiger("Richard");
    tiger.Identify();
    return 0;
}

#include<iostream>
using namespace std;
class Animal{
protected:
    char *name;
public:
    Animal()
    {
        name=NULL;
    }
    Animal(char *n);
    ~Animal() {delete name;}
    virtual void Identify();
};
class Cat:public Animal{
public:
    Cat():Animal(){};
    Cat(char *n):Animal(n){};
    void Identify();
};
class Tiger:public Cat{
public:
    Tiger():Cat(){};
    Tiger(char *n):Cat(n){};
    void Identify();
};
class Dog:public Animal{
public:
    Dog():Animal(){};
    Dog(char *n):Animal(n){};
    void Identify();
};

第五步:增加Zoo類。

#include<iostream>
#include<cstring>
using namespace std;
class Animal{
protected:
    char *name;
public:
    Animal()
    {
        name=NULL;
    }
    Animal(char *n);
    ~Animal() {delete name;}
    virtual void Identify();
};
class Cat:public Animal{
public:
    Cat():Animal(){};
    Cat(char *n):Animal(n){};
    void Identify();
};
class Tiger:public Cat{
public:
    Tiger():Cat(){};
    Tiger(char *n):Cat(n){};
    void Identify();
};
class Dog:public Animal{
public:
    Dog():Animal(){};
    Dog(char *n):Animal(n){};
    void Identify();
};
class Zoo
{
private:
    unsigned int maxanimals;    //動物園最多能圈養的動物數
    unsigned int numanimals;    //動物園當前圈養的動物數
    Animal **residents;          //指向動物園圈養的動物對象的指針數組
public:
    Zoo(unsigned int max);      //構造函數,max爲最多能圈養動物數
    ~Zoo(){delete residents;}    //析構函數
    unsigned int Accept(Animal *d);//接收動物
    void ListAnimals();             //顯示動物園所有動物
};
Animal::Animal(char *n)
{
    name=new char[strlen(n)+1];
    strcpy(name,n);
}
void Animal::Identify()
{
    cout<<"\ngeneric aninal";
}
void Cat::Identify()
{
    cout<<"\nI am a cat named "<<name<<endl;
}
void Tiger::Identify()
{
    cout<<"\nI am a tiger named "<<name<<endl;
}
void Dog::Identify()
{
    cout<<"\nI am a dog named "<<name<<endl;
}
Zoo::Zoo(unsigned int max)
{
    maxanimals=max;
    numanimals=0;
    residents=new Animal *[maxanimals];     //分配空間
    for(int i=0;i<maxanimals;i++)            // 指針清空
        residents[i]=NULL;
}
unsigned int Zoo::Accept(Animal *d)
{
    if(numanimals==maxanimals)      //超過最大圈養數
        return 0;
    ++numanimals;                   //當前圈養數加1
    int i=0;
    while(residents[i]!=NULL)       //指針指向接收的動物對象
    {
        ++i;
    }
    residents[i]=d;
    return ++i;
}
void Zoo::ListAnimals()
{
    cout<<"\n (: There are ";
    cout<<numanimals<<" animals in Zoo.\n";//顯示動物園總的動物數
    if(numanimals>0)
        for(int i=0;i<maxanimals;++i)
            if(residents[i]!=NULL)
                residents[i]->Identify();       //顯示動物對象的名稱和種類
}
int main()
{
    Cat cat("Herry"),*q;
    cat.Identify();
    Dog dog("Jimmy"),*p;
    dog.Identify();
    Tiger tiger("Richard"),*r;
    tiger.Identify();
    Zoo beiging(20);
    q=&cat;
    p=&dog;
    r=&tiger;
    unsigned i=beiging.Accept(p);
    beiging.ListAnimals();
    i=beiging.Accept(q);
    beiging.ListAnimals();
    i=beiging.Accept(r);
    beiging.ListAnimals();
    return 0;
}

日期:2020年3月25日

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章