第13周-任务2-动物怎么叫?——好玩中理解抽象类

简介: 【题目】下面给出了基类Animal和main()函数。 (任务2.1)根据main()函数给出的注释提示,设计出相关的各个类。 (任务2.2)显然,Animal设计为抽象类更合适,Animal不需要能够实例化,是专门作基类使用的。改造程序,使Animal设计为抽象类,这时main()函数中p =newAnimal();将出错,将此行删除。 (任务2.3)每一个Animal的派生类都有

【题目】下面给出了基类Animal和main()函数。

(任务2.1)根据main()函数给出的注释提示,设计出相关的各个类。

(任务2.2)显然,Animal设计为抽象类更合适,Animal不需要能够实例化,是专门作基类使用的。改造程序,使Animal设计为抽象类,这时main()函数中p =newAnimal();将出错,将此行删除。

(任务2.3)每一个Animal的派生类都有一个“名字”数据成员,改造上面的程序,将这一数据成员作为抽象类Animal数据成员被各派生类使用。

class Animal
{
public:
    virtual void cry(){cout<<"不知哪种动物,让我如何学叫?"<<endl;}
};
 
int main( )
{
    Animal *p;
    p = new Animal(); p->cry(); //输出: 不知哪种动物,让我如何学叫?(问题出自此处)
    Mouse m("Jerry"); p=&m; p->cry(); //输出: 我叫Jerry,是一只老鼠,我的叫声是:吱吱吱!
    Cat c("Tom"); p=&c; p->cry(); //输出: 我叫Tom,是一只猫,我的叫声是:喵喵喵!
    Dog d("Droopy");  p=&d; p->cry(); //输出: 我叫Droopy,是一条狗,我的叫声是:汪汪汪!
    Giraffe g("Gill"); p=&g; p->cry(); //输出: 我叫Gill,是长颈鹿,脖子太长,发不出声音来!
    system("pause");
    return 0;
}
【参考解答】

(任务2.1)根据main()函数给出的注释提示,设计出相关的各个类。

#include "iostream"
#include<string>
using namespacestd;
class Animal
{
public:
    virtual void cry() {cout<<"不知哪种动物,让我如何学叫?"<<endl;}
};
 
class Mouse : publicAnimal
{
private:
    string name;
public:
    Mouse(string nam):name(nam){}
    virtual void cry() {cout<<"我叫"<<name<<",是一只老鼠,我的叫声是:吱吱吱!"<<endl;}
};
 
class Cat : publicAnimal
{
private:
    string name;
public:
    Cat(string nam):name(nam){}
    virtual void cry() {cout<<"我叫"<<name<<",是一只猫,我的叫声是:喵喵喵!"<<endl;}
};
 
class Dog : publicAnimal
{
private:
    string name;
public:
    Dog(string nam):name(nam){}
    virtual void cry() {cout<<"我叫"<<name<<",是一条狗,我的叫声是:汪汪汪!"<<endl;}
};
 
class Giraffe : publicAnimal
{
private:
    string name;
public:
    Giraffe(string nam):name(nam){}
    virtual void cry() {cout<<"我叫"<<name<<",是长颈鹿,我的脖子太长,发不出声音来!"<<endl;}
};
 
int main( )
{
    Animal *p;
    p = newAnimal(); p->cry(); //输出: 不知哪种动物,让我如何学叫?(问题出自此处)
    Mouse m("Jerry");p=&m; p->cry(); //输出: 我叫Jerry,是一只老鼠,我的叫声是:吱吱吱!
    Cat c("Tom");  p=&c; p->cry(); //输出: 我叫Tom,是一只猫,我的叫声是:喵喵喵!
    Dog d("Droopy");  p=&d; p->cry(); //输出: 我叫Droopy,是一条狗,我的叫声是:汪汪汪!
    Giraffe g("Gill");  p=&g; p->cry(); //输出: 我叫Gill,是长颈鹿,脖子太长,发不出声音来!
    system("pause");
    return 0;
}

(任务2.2)显然,Animal设计为抽象类更合适,Animal不需要能够实例化,是专门作基类使用的。改造程序,使Animal设计为抽象类,这时main()函数中p =newAnimal();将出错,将此行删除。

#include "iostream"
#include<string>
using namespacestd;
class Animal
{
public:
    virtual void cry() = 0; //纯虚函数,使Animal成为了抽象类
};
 
class Mouse : public Animal
{
private:
    string name;
public:
    Mouse(string nam):name(nam){}
    virtual void cry() {cout<<"我叫"<<name<<",是一只老鼠,我的叫声是:吱吱吱!"<<endl;}
};
 
class Cat : public Animal
{
private:
    string name;
public:
    Cat(string nam):name(nam){}
    virtual void cry() {cout<<"我叫"<<name<<",是一只猫,我的叫声是:喵喵喵!"<<endl;}
};
 
class Dog : public Animal
{
private:
    string name;
public:
    Dog(string nam):name(nam){}
    virtual void cry() {cout<<"我叫"<<name<<",是一条狗,我的叫声是:汪汪汪!"<<endl;}
};
 
class Giraffe : public Animal
{
private:
    string name;
public:
    Giraffe(string nam):name(nam){}
    virtual void cry() {cout<<"我叫"<<name<<",是长颈鹿,我的脖子太长,发不出声音来!"<<endl;}
};
 
int main( )
{
    Animal *p;
    //p = newAnimal(); p->cry(); //抽象类不能实例化对象
    Mouse m("Jerry");p=&m; p->cry(); //输出: 我叫Jerry,是一只老鼠,我的叫声是:吱吱吱!
    Cat c("Tom");  p=&c; p->cry(); //输出: 我叫Tom,是一只猫,我的叫声是:喵喵喵!
    Dog d("Droopy");  p=&d; p->cry(); //输出: 我叫Droopy,是一条狗,我的叫声是:汪汪汪!
    Giraffe g("Gill");  p=&g; p->cry(); //输出: 我叫Gill,是长颈鹿,脖子太长,发不出声音来!
    system("pause");
    return 0;
}

(任务2.3)每一个Animal的派生类都有一个“名字”数据成员,改造上面的程序,将这一数据成员作为抽象类Animal数据成员被各派生类使用。

#include "iostream"
#include<string>
using namespacestd;
 
class Animal
{
protected:
    string name; //类族中的数据成员放在这儿
public:
    Animal(string nam):name(nam){} //基类的构造函数
    virtual void cry()=0;
};
 
class Mouse : publicAnimal
{
public:
    Mouse(string nam):Animal(nam){}  //派生类的构造函数要这样写
    virtual void cry() {cout<<"我叫"<<name<<",是一只老鼠,我的叫声是:吱吱吱!"<<endl;}
};
 
class Cat : publicAnimal
{
public:
    Cat(string nam):Animal(nam){}
    virtual void cry() {cout<<"我叫"<<name<<",是一只猫,我的叫声是:喵喵喵!"<<endl;}
};
 
class Dog : publicAnimal
{
public:
        Dog(string nam):Animal(nam){}
    virtual void cry() {cout<<"我叫"<<name<<",是一条狗,我的叫声是:汪汪汪!"<<endl;}
};
 
class Giraffe : publicAnimal
{
public:
    Giraffe(string nam):Animal(nam){}
    virtual void cry() {cout<<"我叫"<<name<<",是长颈鹿,我的脖子太长,发不出声音来!"<<endl;}
};
 
int main( )
{
    Animal *p;
    //p = newAnimal(); p->cry(); //抽象类不能实例化对象了!!!
    Mouse m("Jerry");p=&m; p->cry(); //输出: 我叫Jerry,是一只老鼠,我的叫声是:吱吱吱!
    Cat c("Tom");  p=&c; p->cry(); //输出: 我叫Tom,是一只猫,我的叫声是:喵喵喵!
    Dog d("Droopy");  p=&d; p->cry(); //输出: 我叫Droopy,是一条狗,我的叫声是:汪汪汪!
    Giraffe g("Gill");  p=&g; p->cry(); //输出: 我叫Gill,是长颈鹿,我的脖子太长,发不出声音来!
    system("pause");
    return 0;
}


目录
相关文章
|
存储
STM32F103标准外设库——GPIO 输入、输出 (五)
STM32F103标准外设库——GPIO 输入、输出 (五)
877 0
STM32F103标准外设库——GPIO 输入、输出 (五)
|
定位技术 数据安全/隐私保护 iOS开发
一文讲清楚地图地理坐标系
一文讲清楚地图地理坐标系
530 0
|
编译器 vr&ar C++
CMake构建Makefile深度解析:从底层原理到复杂项目(二)
CMake构建Makefile深度解析:从底层原理到复杂项目
481 0
|
定位技术 API 开发者
地图:nuxt3高德地图简单使用
地图:nuxt3高德地图简单使用
674 0
|
7月前
|
机器学习/深度学习 存储 人工智能
Satori:快速体验MIT与哈佛推出7B参数的推理专家模型,具备自回归搜索和自我纠错能力
Satori 是由 MIT 和哈佛大学等机构联合推出的 7B 参数大型语言模型,专注于提升推理能力,具备强大的自回归搜索和自我纠错功能。
147 5
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能在医疗诊断中的最新应用
人工智能在医疗诊断中的最新应用
|
关系型数据库 MySQL 数据库
龙蜥操作系统上安装MySQL:步骤详解与常见问题解决
龙蜥操作系统上安装MySQL:步骤详解与常见问题解决
1173 0
|
存储 弹性计算 人工智能
阿里云服务器4核8g配置5M带宽收费标准及优惠价格参考
阿里云服务器4核8g配置5M带宽多少钱?阿里云服务器支持按量(小时)付费和按月付费及按年付费,4核8g配置按量付费收费标准最低0.533866元每小时,按月收费最低收费标准为231.0元1个月,实际购买中,新老用户均可通过阿里云活动下单购买,相对来说通过活动下单购买更加便宜,
951 0
阿里云服务器4核8g配置5M带宽收费标准及优惠价格参考
|
缓存 编译器 程序员
嵌入式开发环境Vscode开发STM32单片机程序
嵌入式开发环境Vscode开发STM32单片机程序
430 1
|
Java Maven
Maven标准目录结构介绍
src/main/java:源代码目录 src/main/resources:资源文件目录 src/test/java:测试代码目录 src/test/resources:测试资源文件目录 这里只是部分结构,像jar或者war工程如果有源代码的一般是这个结构,但这个结构也不是必须的,不同的项目不同的需求也可以有不同的结构。
784 0
Maven标准目录结构介绍