第四章 课后习题

2023-10-26

一、填空题

(1)如类果类A继承了B,那么类A被称为     派生     类,而类B被称为     基     类。

(2)C++的两种继承为:   单继承     多继承   

(3)在默认情况下的继承方式为  私有继承方式  

(4)从基类中公有派生一个类时,基类的公有成员就成为派生类的  公有  成员,而这个基类的保护成员就成为派生类的  保护成员。

(5)C++提供了  多继承   机制,允许一个派生类可以继承多个基类,甚至这些基类是互不相关的。

(6)类X中的名字N 支配类Y中同名的名字N,是指类X以类Y为它的一个基类,这称为   支配规则   

(7)引进虚基类的目的是   解决二义性  

(8)在一个继承结构中,解决二义性的方法有   使用作用域运算符     引进虚基类  

二、选择题(至少选一个,可以多选)
(1)C++语言建立类族是通过( B )。
  A.类的嵌套   B.类的继承    C.虚函数     D.抽象类

(2) 继承是( CD )的方法。
  A.将特殊的类变成通用的类
  B.将通用的参数传送给特殊的类的对象
  C.将通用的类变成特殊的类
  D.将已有的类添加新的特性,但不重写它们

(3)继承的优点是( ABC )。
  A.扩大类的使用范围,更便于使用类库
  B.避免重写程序代码,提供有用的概念框架
  C.把类转化成有条理的层次结构
  D.通过继承的自然选择和重写使类进一步拓展

(4)下面叙述不正确的是( C )。
  A.基类的保护成员在保护派生类中仍然是保护的
  B.基类的保护成员在公有派生类中仍然是保护的
  C.基类的保护成员在私有派生类中仍然是保护的
  D.对基类的保护成员的访问必须是无二义性的

(5)派生类的对象对它的基类成员中( A )是可以访问的。
  A.公有继承的公有成员
  B.公有继承的私有成员
  C.公有继承的保护成员
  D.私有继承的公有成员

(6)( C )是可以访问类对象的私有数据成员的。

   A.该类的对象                          B.该类友元类派生的成员函数                                            C.类中的友元函数                       D.公有派生类的成员函数

(7)多继承是( B )。
   A.多个单继承的叠加 
   B.派生类有多个直接基类
   C.多个派生类有唯一的基类
   D.每个派生类最多只有一个直接基类,但它可以有多个间接基类

(8)关于多继承二义性的描述,( D )是错误的。
   A.派生类的多个基类中存在同名成员时,派生类对这个成员访向可能出现二义性
   B.由于二义性原因,一个类不能从同一个类中一次以上直接继承
   C.使用作用域运算符对成员进行限制可以解决二义性
   D.派生类和它的基类中出现同名函数时,派生类对这个成员函数的访问可能出现二义性

(9) 作用域运算符通常用来( AD )。  
   A.指定特定的类 
   B.指明从哪一个基类中导出来的
   C.在某些成员函数中限定静态变量的可视范围 
   D.解决二义性

(10)多继承派生类析构函数释放对象时,( A )被最先调用。
   A.派生类自己的析构函数
   B.基类的析构函数
   C.根基类的析构函数
   D.派生类中子对象类的析构函数
  三、判断题

(1)增加一个基类的派生类,需要对基类进行根本改变。(错)

(2)如果没有为派生类指定构造函数,则派生类的对象会调用基类的构造函数。(错)

(3)对一个类来说,可能的访问权限为: private.public.protected 和不可访问。(错)

(4)无论哪种派生方式,基类中的私有成员在派生类中都是不可访问的。(对)

(5)在派生过程中,派生类继承包括构造函数和析构函数在内的所有基类成员。(错)

(6) 在单继承中,派生类对象对基类成员函数的访问也可能出现二义性。(错)

  四、筒答题  

(1)在面向对象技术中,类与类之间的关系如何表示?

答:在面向对象技术中,类是数据和操作的集合,它们之间主要有3中关系:Has-A、Uses-A和Is-A。
    Has-A表示类的包含关系,用以描述一个类由多个“部件类”构成。在面向对象技术中,实现Has-A关系用类成员表示,即第3章中已学的子对象。
    Uses-A表示一个类部分地使用另一个类。在面向对象技术中,这种关系通过类之间成员函数的相互联系或对象参数传递实现。另外,通过定义友元也能实现这种关系。
    Is-A表示一种分类方式,描述类的抽象和层次关系。

(2)简述赋值兼容规则。

答:所谓赋值兼容规则是指在公有继承情况下,一个派生类的对象可以作为基类的对象来使用。具体来说,就是下面3种情况:
①派生类的对象可以赋给基类的对象。
②派生类的对象可以初始化基类的引用。
③派生类的对象的地址可以赋给指向基类的指针。

(3)简述在 3 种继承方式下基类成员的访问权限。

答:当类的继承方式为公有继承时,在派生类中,基类的公有成员和保护成员被继承后分别作为派生类的公有成员和保护成员,这样使得派生类的成员函数可以直接访问它们,而派生类的成员函数无法直接访问基类的私有成员。    在类外部,派生类的对象可以访问继承下来的基类公有成员。
当类的继承方式为私有继承时,在派生类中,基类的公有成员和保护成员作为派生类的私有成员,派生类的成员函数可以直接访问它们,而派生类的成员函数无法直接访问基类的私有成员。在类外部,派生类的对象无法访问基类的所有成员。
    当类的继承方式为保护继承时,在派生类中,基类的公有成员和保护成员作为派生类的保护成员,派生类的成员函数可以直接访问它们,而派生类的成员函数无法直接访问基类的私有成员。在类外部,派生类的对象无法基类的所有成员。

(4)简述在继承方式下创建派生类对象时,构造函数调用顺序,以及删除派生类对象时派生类析构函数的调用顺序。

答:创建派生类对象时构造函数调用顺序:首先调用基类构造函数,子对象所在类构造函数次之,最后执行派生类构造函数。
    删除派生类对象时派生类析构函数的调用顺序:先调用派生类的析构函数;再调用派生类中子对象类的析构函数;再调用普通基类的析构函数;最后调用虚基类的析构函数。

(5) 简述派生类构造函数的规则。

答:第1种情况:若派生类有构造函数而基类没有,当创建派生类的对象时,派生类相应的构造函数会被自动调用。
    第2种情况:若派生类没有构造函数而基类有,则基类必须拥有默认的构造函数。只有这样,当创建派生类的对象时,才能自动调用基类的默认构造函数。
    第3种情况:若派生类有构造函数,且基类有默认构造函数,则创建派生类的对象时,基类的默认构造函数会自动调用,除非当前被调用的派生类构造函数在其初始化列表中显示调用了基类的有参构造函数。
    第4种情况:若派生类和基类都有构造函数,但基类没有默认构造函数,则派生类的每一个构造函数必须在其初始化列表中显示调用基类的某个构造函数。只有这样,当创建派生类的对象时,基类的构造函数才能获得执行机会。

  五、程序分析题(写出程序的输出结果)
#include<iostream>
using namespace std;
class A
{
public:
    A(int i,int j){a=i;b=j;}
    void move(int x,int y){a+=x;b+=y;}
    void disp()
    {
        cout<<"("<<a<<","<<b<<")"<<endl;
    }
private:
    int a,b;
};
class B:public A
{
public:
   B(int i,int j,int k,int l):A(i,j),x(k),y(l){}
   void disp()
   {
       cout<<x<<","<<y<<endl;
   }
   void fun1(){ move(13,15);}
   void fun2(){A::disp();}
private:
    int x,y;
};
int main()
{
   A aa(11,12);//语句1
   aa.disp();//语句2
   B bb(13,14,15,16);//语句3
   bb.fun1();//语句4
   bb.A::disp();//语句5
   bb.B::disp();//语句6
   bb.fun2();//语句7
   return 0;
}

输出结果如下:


分析:程序首先执行语句1,创建对象aa,调用构造函数,a、b得到值11和12;执行语句2,调用基类中的dis()函数,输出第一行结果。接着执行语句3,创建对象bb,调用派生类A中的构造函数,i、j、x、y得到初始值13、14、15、16;执行语句4,调用fun1()函数,fun1函数调用基类中的move()函数x和y得到值13和15,执行move()函数体类的程序,算出a和b的值,接着执行语句5,输出第二行结果。然后执行语句6,输出第三行结果。最后执行语句7,因为上面执行语句2时,a、b已经得到值26和29,所以第四行的输出结果和第二行一样。

六、程序设计题

定义一个点类(Point)、矩形类(Rectangle)和立方体类(Cube)的层次结构。矩形包括长度和宽度两个新数据成员,矩形的位置从点类继承,立方体类由长度、宽度和高度构成。要求各类提供支持初始化的构造函数和显示自己成员的成员函数。编写主函数,测试这个层次结构,输出立方体类的相关信息。

编写程序如下:

#include<iostream>
using namespace std;
class Point
{
public:
   Point(int a,int b){x=a;y=b;}
   void displayxy()
   {
       cout<<"The postion of point:";
       cout<<"("<<x<<","<<y<<")"<<endl;
   }
private:
    int x,y;
};
class Rectangle:public Point
{
    public:
       Rectangle(int a,int b,int c,int d ):Point(a,b){i=c;j=d;}
       void displayd()
       {
           cout<<"The length and width of rectangle:";
           cout<<i<<","<<j<<endl;
       }
    private:
    int i,j;
};
class Cube:public Rectangle
{
    public:
       Cube(int a,int b,int c,int d,int e):Rectangle(a,b,c,d){k=e;}
       void displayk()
       {
           cout<<"The height of cube:"<<k<<endl;
       }
    private:
      int k;
};
int main()
{
   Cube v(20,40,3,5,6);
   cout<<"The data of cube:"<<endl;
   v.displayxy();
   v.displayd();
   v.displayk();
   return 0;
}

输出结果如下:


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第四章 课后习题 的相关文章

  • 财务数据分析?奥威BI数据可视化工具很擅长

    BI数据可视化工具通常是可以用户各行各业 用于不同主题的数据可视化分析 但面对财务数据分析这块难啃的骨头 能够好好地完成的 还真不多 接下来要介绍的这款BI数据可视化工具不仅拥有内存行列计算模型这样的智能财务指标计算功能 还拥有一套标准化
  • spark报错OutOfMemory

    最近在使用spark进行分析的时候 几千万的数据量感觉不多 但是跑起来非常慢 内存溢出OutOfMemory 1 然后在有使用map的地方 在map之前进行分区repartition 2 join会有shuffle产生 shuffle也会产
  • java-PDF读取一页某一区域内容

    首先还是我的风格 先看效果 在某一页pdf中获取某一块区域的内容和图片 这样就能获取想要的东西了 上代码 这里需要注意maven 是两部分
  • 电路交换,报文交换和分组交换的原理、区别、优缺点

    电路交换 电路交换技术是在通信两端设备间 通过一个一个交换设备中线路的连接 实际建立了一条专用的物理线路 在该连接被拆除前 这两端的设备单独占用该线路进行数据传输 电话系统就是采用了线路交换技术 通过一个一个交换机中的输入线与输出线的物理连
  • word2003脚注问题

    问题分析 在题目上插入脚注的时候 脚注放在文件结尾 然后正文拆开了 不能续前节 解决办法 word2003中 工具 gt 选项 gt 兼容性
  • Java中的byte详解

    Java中的byte详解 介绍 byte 即字节 由8位的二进制组成 在Java中 byte类型的数据是8位带符号的二进制数 在计算机中 8位带符号二进制数的取值范围是 128 127 所以在Java中 byte类型的取值范围也是 128
  • OpenGL 红宝书 反走样 雾 点参数 多边形偏移

    6 2 反走样 void glHint GLenum target GLenum hint 控制OpenGL的某些行为 参数target是要控制的行为 参数hint可以是GL FASTEST GL NICEST GL DONT CARE 效
  • 组成原理---中断

    文章目录 中断的基本概念 中断请求与判优 中断响应 中断服务与返回 中断系统是计算机中实现中断功能的软 硬件总称 一般在 CPU 中配置中断机构 在外设接口中配置中断控制器 在软件上设计相应的中断初始化程序和中断服务程序 中断的基本概念 在
  • python从入门到精通 第一节 数据类型

    Python 中的变量不需要声明 每个变量在使用前都必须赋值 变量赋值以后该变量才会被创建 在 Python 中 变量就是变量 它没有类型 我们所说的 类型 是变量所指的内存中对象的类型 等号 用来给变量赋值 等号 运算符左边是一个变量名
  • 分布式锁的实现与应用

    为什么需要锁 在多任务环境下解决并发场景的数据竞争问题 Java常见锁 我们可以根据锁是否包含某一特性来进行分组归类 从线程是否对资源加锁 可以将锁分为乐观锁和悲观锁 从资源已被锁定时 线程是否阻塞 可以分为自旋锁 JUC下的atomic家

随机推荐

  • react实现计数器

    var In display gt div display div var Btn click gt
  • 同页面javascript中文参数传递

    修改前
  • VMware Workstation 14 Pro 安装 Windows Server 2003(完)

    一 下载镜像文件 Windows Server 2003有多种版本 每种都适合不同的商业需求 Windows Server 2003 Web Edition WindowsServer2003Web版 用于构建和存放Web应用程序 网页和X
  • Python入门的20个基础练习

    01 Hello World python的语法逻辑完全靠缩进 建议缩进4个空格 如果是顶级代码 那么必须顶格书写 哪怕只有一个空格也会有语法错误 下面示例中 满足if条件要输出两行内容 这两行内容必须都缩进 而且具有相同的缩进级别 pri
  • sqli - labs - Less 17

    我们先来看看源码 这里我们可以看到 首先进行上传数据的判断 但是 uname是通过上面的check input函数进行相关过滤所以用户名必须要正确 密码可以忽略 所以本关在密码这里找到突破口 可以看出在得到row变量之后 如果不为空 代码将
  • STM32跳至硬件错误中断(HardFault_Handle)

    1 遇到错误问题是数据类型不对 导致该步骤永远不能执行到 跳至硬件错误中断 所以硬件中断可尝试查找数据类型错误 2 堆栈设置错误也会跳至hardwarefault 3 如果上电后 在调试时 执行单步 会在不确定位置的地方产生HardFaul
  • 基于OpenCV的手势识别完整项目(Python3.7)

    这是我的本科毕设题目 刚开始接触机器学习这方面 感谢CSDN和GitHub上的大佬 网上类似项目很多 方法也有很多 自己顺带进行了整理 边做毕设边分享一下自己学习心得吧 也算是梳理一下所学知识 各大佬有什么好的建议还请指出 不吝赐教 项目简
  • Qt的槽函数崩溃问题

    当Qt的槽函数是一个lambda表达式时 如果传入的方法为引用传递 而你又在lambda表达式里使用了外面定义的stl或类 那么就会崩溃 这是因为Qt的槽函数是一个轮询的过程 第一次你进入这个表达式结束时会进行一次自动析构 第二次进入这个l
  • linux删除文件后没有释放空间

    系统 centos 7 现象 早上收到阿里云短信 发现一台服务器的磁盘空间使用率达到90 昨天晚上已经加了定时任务 难道没有啥用 无奈的我打开电脑 解决 由于已经解决 当时没有截图 查看磁盘空间 df h 找到对应文件 进行删除 rm fi
  • yaml文件的读写

    官方使用文档 https yaml cpp docsforge com 写入 include
  • addr2line命令

    在Linux下写C C 程序的程序员 时常与Core Dump相见 在内存越界访问 收到不能处理的信号 除零等错误出现时 我们精心或不精心写就的程序就直接一命呜呼了 Core Dump是Linux仁慈地留下的程序的尸体 帮助程序员们解决了一
  • Layout Object Tree 创建

    站在老罗的肩膀上 https blog csdn net luoshengyang article details 50615628 每一个HTML标签在DOM Tree中都有一个对应的HTMLElement节点 相应地 在DOM Tree
  • java集合框架--集合接口

    java 集合框架使程序处理集合数组的方法标准化 集合框架包含了一组标准的接口 对这些接口 提供了几个标准的实现工具 LinkedList HashSet 和 TreeSet 集合接口 接口 描述 Collection 集合框架的顶层接口
  • JAVA中sort()函数的使用方法的个人总结

    1 sort 函数的基本格式 默认排序为升序排序 Arrays sort int a int fromIndex int toIndex Arrays sort 数组名 起始下标 终止下标 一个简单的排序例子 import java uti
  • PCB绘制常用规范

    PCB包含四个文件 原理图 原理图库 封装库文件 PCB文件 首先新建一个PCB工程 File gt New gt Project gt PCBProject 1 原理图文件 name SchDoc File gt new gt Schma
  • Python自动化测试实战篇(3)优化unittest批量自动化接口测试代码,ddt驱动+yaml实现用例调用,输出HTMLTestRunner测试报告

    这些是之前的文章 里面有一些基础的知识点在前面由于前面已经有写过 所以这一篇就不再详细对之前的内容进行描述 Python自动化测试实战篇 1 读取xlsx中账户密码 unittest框架实现通过requests接口post登录网站请求 JS
  • LAMP-web平台搭建(Linux+apache+mysql+php)

    一 介绍 apache 实现网页共享传输 MySQL 数据存储 PHP 实现页面解析 浏览器仅能解析简单的HTML语言 无法直接解析PHP语言 二 部署方式 yum 安装 优点 安装部署便捷 快速 缺点 软件版本固定 且版本较低 源码安装
  • OkHttpClient 发送请求示例

    import okhttp3 import java util Map 类名称 OkHttpClientUtil 类描述 OkHttp 客户端 public class OkHttpClientUtil public static Stri
  • linux内存利用率多少合适,如何理解linux服务器中的内存使用率和平均负载

    我使用的是具有128GB内存和24个内核的 Linux服务器 我使用top来查看它的使用量 它的输出粘贴在帖子的末尾 这是两个问题 1 我看到每个正在运行的进程占用很小的内存百分比 MEM不超过0 2 大多数只有0 0 但总内存几乎与第四行
  • 第四章 课后习题

    一 填空题 1 如类果类A继承了B 那么类A被称为 派生 类 而类B被称为 基 类 2 C 的两种继承为 单继承 和 多继承 3 在默认情况下的继承方式为 私有继承方式 4 从基类中公有派生一个类时 基类的公有成员就成为派生类的 公有 成员