西北农林科技大学2024学年C++面向对象程序设计OJ——T11 动物类的继承与派生

一.题目描述

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];
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失忆已成习惯.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值