一.题目描述
Description
设计一个动物类CAnimal和它的派生类马类CHorse、鸟类CBird,并基于马类和鸟类派多重派生出飞马类CPegasus,要求:
(1)CAnimal类中有string类型数据成员name和int类型数据成员年龄age,构造函数可实现name和age的初始化和输出,输出格式为:cout<<"Animal constructor: "<<name<<"" <<age<<endl,析构函数输出格式为:cout<< "Animal destructor "<< endl;
(2)CHorse类虚继承于CAnimal类,新增int类型数据成员马力power并调用其构造函数实现初始化,输出格式为:cout<<"Horse constructor: "<< power<<endl,新增成员函数Talk(),输出格式为:cout << "Whinny..." << endl,析构函数输出格式为:cout<< "Horse destructor" << endl;
(3)CBird类虚继承于CAnimal类,新增float类型数据成员翼展wingspan并调用其构造函数实现初始化,输出格式为:cout<<"Bird constructor: "<< wingspan<<endl,新增成员函数Talk(),输出格式为:cout<< "Chirp..."<<endl,析构函数输出格式为:cout<<"Bird destructor" << endl;
(4)CPegasus类多重继承于CHorse类和CBird类,其构造函数输出格式为:cout<<"Pegasus constructor"<<endl,重新定义void Talk(){ CHorse::Talk();}函数覆盖其直接基类中的两个Talk函数,析构函数输出格式为:cout<< "Pegasus destructor" << endl;
在main函数中,先输入派生类对象个数n,再依次输入派生类类别,其中字符'H'、'B'、'P'分别表示CHorse类、CBird类、CPegasus类,如果输入其他字符则输出"Input error! ",然后输入对应数据成员信息构造相应对象,最后依次调用n个对象的Talk成员函数实现输出。
二.输入与输出
Input
派生类对象个数n,派生类类型,数据成员初始化信息
Output
构造函数输出信息
各对象的Talk函数调用输出结果
析构函数输出信息
Sample Input 1
5 H horse1 3 2000 B bird1 2 1.5 P pegasus1 5 10000 3.6 H horse2 4 3500 An animal1 4
Sample Output 1
Animal constructor: horse1 3 Horse constructor: 2000 Animal constructor: bird1 2 Bird constructor: 1.5 Animal constructor: pegasus1 5 Horse constructor: 10000 Bird constructor: 3.6 Pegasus constructor Animal constructor: horse2 4 Horse constructor: 3500 Input error! Whinny... Chirp... Whinny... Whinny... Horse destructor Animal destructor Bird destructor Animal destructor Pegasus destructor Bird destructor Horse destructor Animal destructor Horse destructor Animal destructor
三.代码
#include<iostream>
#include<vector>
using namespace std;
class CAnimal{
protected:
string name;
int age;
public:
CAnimal(string name="",int age=0):name(name),age(age){
cout<<"Animal constructor: "<<name<<" " <<age<<endl;
}
virtual ~CAnimal(){
cout<< "Animal destructor"<< endl;
}
virtual void Talk() = 0;
};
class CHorse:virtual public CAnimal{
protected:
int power;
public:
CHorse(string name="",int age=0,int power=0):CAnimal(name,age){
this->power=power;
cout<<"Horse constructor: "<< power<<endl;
}
void Talk(){
cout << "Whinny..." << endl;
}
~CHorse(){
cout<< "Horse destructor" << endl;
// cout<<"Horse: "<< power<<endl<<endl;
}
};
class CBird:virtual public CAnimal{
protected:
float wingspan;
public:
CBird(string name="",int age=0,float wingspan=0):CAnimal(name,age){
this->wingspan=wingspan;
cout<<"Bird constructor: "<< wingspan<<endl;
}
void Talk(){
cout<< "Chirp..."<<endl;
}
~CBird(){
cout<< "Bird destructor" << endl;
// cout<<"Bird : "<< wingspan<<endl<<endl;
}
};
class CPegasus:public CHorse,public CBird{
public:
CPegasus(string name="",int age=0,int power=0,float wingspan=0):CAnimal(name,age),CHorse(name,age,power),CBird(name,age,wingspan){
cout<<"Pegasus constructor"<<endl;
}
void Talk(){ CHorse::Talk();}
~CPegasus(){
cout<< "Pegasus destructor" << endl;
}
};
int main(){
int n;
cin>>n;
CAnimal *a[n];
int k = 0;
for(int i = 0;i < n;i++){
string c;
string s;
int age;
cin>>c>>s>>age;
if(c == "H"){
int power;
cin>>power;
a[i-k] = new CHorse(s,age,power);
}
else if(c == "B"){
float wingspan;
cin>>wingspan;
a[i-k] = new CBird(s,age,wingspan);
}
else if(c == "P"){
int power;
cin>>power;
float wingspan;
cin>>wingspan;
a[i-k] = new CPegasus(s,age,power,wingspan);
}
else{
cout<<"Input error!"<<endl;
string sz;
getline(cin,sz);
k++;
}
}
for(int i = 0;i < n-k;i++){
a[i]->Talk();
}
for(int i = 0; i < n-k;i++){
delete a[i];
}
}