實驗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日