C++第五六单元测试

1【单选题】在公有派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中的(   C  )。(2.0分)

  • A、公有成员
  • B、保护成员
  • C、私有成员
  • D、保护成员或私有成员

注意从类外访问与从派生类中访问 

2【单选题】什么情况下必须使用虚析构函数?(  A   )(2.0分)

  • A、使用delete删除由基类指针指向的派生类对象
  • B、派生类构造函数是虚函数
  • C、使用delete删除由派生类指针指向的派生类对象
  • D、基类构造函数是虚函数

 构造函数不能是虚函数

3【单选题】一个类的层次结构中,定义有虚函数,并且都是公有继承,在下列情况下,实现动态绑定的是(   )。(2.0分)

  • A、使用构造函数调用虚函数
  • B、使用类名限定调用虚函数
  • C、使用类的对象调用虚函数
  • D、使用成员函数调用虚函数

4【单选题】下列关于虚函数的描述中,错误的是:(    )。(2.0分)

  • A、static成员函数可以说明为虚函数
  • B、虚函数是一个成员函数
  • C、在类的继承的层次结构中,虚函数是说明相同的函数
  • D、虚函数具有继承性

静态成员函数(static函数)不能被声明为虚函数。虚函数是与对象的动态类型相关的,它们依赖于对象的运行时类型,而静态成员函数不依赖于任何对象实例,因此不能是虚函数。

5【单选题】下列有关继承和派生的叙述中,正确的是:(   )(2.0分)

  • A、派生类不能访问通过私有继承的基类的保护成员
  • B、如果基类没有默认构造函数,派生类就应当声明带形参的构造函数
  • C、多继承的虚基类不能够实例化
  • D、基类的析构函数和虚函数都不能够被继承,需要在派生类中重新实现

如果派生类是通过私有方式继承基类,那么基类的保护成员(protected)在派生类中仍然是可以访问的,尽管它们不能被派生类的对象访问。

6【单选题】纯虚函数和虚函数的主要区别是: (    D    )(2.0分)

  • A、返回值类型
  • B、成员访问修饰符
  • C、类中的位置
  • D、纯虚函数不能有实现

7【单选题】Employee是基类,HourlyWorker是派生类,并重定义了非虚函数print,下面的程序段调用了两个print函数,输出结果是否相同?(    D    )

HourlyWorker h;

Employee *ePtr = &h;
ePtr->print();

ePtr->Employee::print();

  • A取决于print函数的实现
  • B、是,如果print是static函数
  • C、否
  • D、是

8【单选题】从同一个基类派生出的各个类的对象之间,(    D    )。(2.0分)

  • A共享部分数据成员,每个对象还包含基类的所有属性
  • B、共享所有数据成员,每个对象还包含基类的所有属性
  • C、共享部分数据成员和函数成员
  • D、不共享任何数据成员,但每个对象还包含基类的所有属性

每个对象都有自己的实例变量副本,因此它们不共享数据成员。但是,每个派生类的对象确实包含了基类的所有属性,因为继承机制使得派生类可以访问基类的属性和方法。

9【单选题】下面叙述不正确的是(   D  )。(2.0分)

  • A、赋值兼容规则也适用于多重继承的组合
  • B、对基类成员的访问必须是无二义性的
  • C、派生类一般都用公有派生
  • D、基类的公有成员在派生类中仍然是公有的

10【单选题】以下说法正确的是:(   )(2.0分)

  • A派生类可以和基类有同名成员函数,但是不能有同名成员变量
  • B、派生类和基类的同名成员函数必须参数表不同,否则就是重复定义
  • C、派生类和基类的同名成员变量存放在相同的存储空间
  • D、派生类的成员函数中,可以调用基类的同名同参数的成员函数

在派生类中,可以通过基类名和作用域解析运算符(::)显式调用基类的同名成员函数,或者使用this指针来调用基类的成员函数。

 11【判断题】派生类可以有选择性地继承基类的部分成员。(    )(2.0分)

派生类会继承基类的所有成员(除了构造函数、析构函数和虚析构函数之外),而不能有选择性地继承部分成员。派生类会继承基类的所有公有和保护成员,但不会继承基类的私有成员。如果派生类需要使用基类的私有成员,可以通过基类的公有或保护成员函数来访问。

12【判断题】派生类的默认构造函数包含有直接基类的构造函数。(   对   )(2.0分)

13【判断题】一个抽象类中可以包含有多个纯虚函数,一个派生类也可以包含多个虚函数(对   )

 

注意书写形式 

14【判断题】虚函数有继承性,基类中说明的虚函数只要在它的派生类中与它名字相同的,一定是虚函数。(     )

15【判断题】虚函数可以被类的对象调用,也可以被类的对象指针和对象引用调用。(      )(2.0分)

16【判断题】虚函数实现的多态是在编译时期确定的。(  错  )(2.0分)

虚函数实现的多态是在运行时(runtime)确定的,而不是在编译时期(compile-time)。

C++运行时会根据对象的实际类型(动态类型)来决定调用哪个函数,这个过程称为动态绑定或晚期绑定。

 17【填空题】

写出下列程序的输出结果:

#include <iostream >using namespace std;class A {private:int nVal;public:void Fun(){ cout << "A::Fun" << endl; };virtual void Do(){ cout << "A::Do" << endl; }};class B:public A {public:virtual void Do(){ cout << "B::Do" << endl;}};class C:public B {public:void Do( ){ cout <<"C::Do"<<endl;  }void Fun(){ cout << "C::Fun" << endl; }};void Call( A * p)  {p->Fun();  p->Do();}int main()  {Call( new A());Call( new C());return 0;}
1 A::Fun2 A::Do3 B::Do4 C::Do5 C::Fun

答案: 

1 2 1 4

  1. Call(new A()):这里创建了类A的对象,并将其地址传递给Call函数。由于Fun不是虚函数,所以会调用A类的Fun函数,输出为"A::Fun"。对于Do函数,它是虚函数,会根据对象的实际类型来调用相应的函数,因此会调用A类的Do函数,输出为"A::Do"。

  2. Call(new C()):这里创建了类C的对象,并将其地址传递给Call函数。对于Fun函数,虽然C类中定义了自己的Fun函数,但由于Call函数中的参数是A*类型,所以会调用A类的Fun函数,输出为"A::Fun"(不是虚函数的话,就会调用A*)。对于Do函数,它是虚函数,会根据对象的实际类型来调用相应的函数,因此会调用C类的Do函数,输出为"C::Do"。

18【填空题】写出下面程序的输出结果:

#include <iostream>using namespace std;class B {public:B( ){ cout << "B_Con" << endl; }~B( ) { cout << "B_Des" << endl; }};class C:public B {public:C( ){ cout << "C_Con" << endl; }~C( ) { cout << "C_Des" << endl; }};int main(){C * pc = new C;delete pc;return 0;}

答案: 

 [填空1] B_Con[填空2] C_Con[填空3] C_Des[填空4] B_Des

考察对多态中(继承)的构造函数与析构函数的运用
先调用基类的构造函数,再调用派生类的构造函数,析构函数的调用顺序与其相反

19【填空题】写出下面程序的输出结果:

#include <iostream >using namespace std;class A {public:A( ) { }virtual void func(){ cout << "A::func" << endl; }virtual void fund( ){ cout << "A::fund" << endl; }void fun(){ cout << "A::fun" << endl;}};class B:public A {public:B ( ) { func( ) ; }void fun( ) { func( ) ; }};class C : public B {public :C( ) { }void func( ){cout << "C::func" << endl; }void fund( ){ cout << "C::fund" << endl;}};int main(){A * pa = new B();pa->fun();B * pb = new C();pb->fun();return 0;}
1 A::func2 A::fund3 A::fun4 C::func5 C::fund

答案

1 3 1 4

  1. 1.A * pa = new B();:创建了一个B类型的对象,并将其地址赋给了一个指向A的指针。由于B继承自Apa实际上指向的是一个B类型的对象。
  2. pa->fun();在 B 类的构造函数中直接调用了 func() 方法,而 B 类并没有重写这个方法,所以调用的是基类 A 中的 func 方法。 输出A::func
  3. 然后再调用函数fun:pa->fun();:这里调用了fun函数。由于fun不是虚函数,所以会根据指针的静态类型(即A*)来调用A类的fun函数,输出为"A::fun"。
  1. B * pb = new C();:创建了一个C类型的对象,并将其地址赋给了一个指向B的指针。由于C继承自Bpb实际上指向的是一个C类型的对象。

  2. pb->fun();:这里调用了fun函数。由于fun不是虚函数,所以会根据指针的静态类型(即B*)来调用B类的fun函数。在 B 类的构造函数中直接调用了 func() 方法,而 B 类并没有重写这个方法,所以调用的是基类 A 中的 func 方法。 输出A::func

  3. 由于 func 是虚函数,会调用 C 类的 func 方法(因为 pb 实际上指向的是 C 类型的对象),输出C::func

20【填空题】

#include <iostream>using namespace std;class A {public:A( ) {  }virtual void func( )  {cout << "A::func" << endl; }~A( ) { }virtual void fund( )  {cout << "A::fund" << endl; }};class B:public A {public:B ( ) {  func( ) ;  }void fun( ) {   func( ) ; }~B ( ) {  fund(  ); }};class C : public B {public :C( ) { }void func( )    { cout << "C::func" << endl; }~C() {  fund( ); }void fund()     { cout << "C::fund"<< endl; }};int main(){ C c;  return 0;  }
运行结果:[填空1][填空2][填空3]把对应的选项编号填入空中:1 A::func2 A::fund3 C::func4 C::fund

 答案

1 4 2

  1. C c;:创建了一个C类型的对象c。由于C继承自BB继承自A,对象的构造将遵循构造函数链,从最基类A开始,然后是B,最后是C

  2. 先调用A的构造,再调用B的构造,其中会调用函数func(),但是B中无重写该函数,就会调用基类A的func(),输出A::func,最后调用C的构造(即使C类重写了func()函数,B类的构造函数中调用func()时也不会调用C类的版本,因为这是在编译时决定的,而且C的构造函数还没有执行,C类的对象还没有完全构造。因此,会调用A类的func()函数,输出"A::func"。

  3. 先调用C的析构,会调用虚函数fund(),但是C中已重写该函数,输出C::fund,然后调用B的析构,会调用虚函数fund(),但是B类中没有重写该函数,会调用A类中的fund(),输出A::fund,最后调用A的析构函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JPA查询部分字段的最佳实践

最近在接手一个项目&#xff0c;用的是JPA&#xff0c;以前没使用过。在开发新的需求过程中&#xff0c;发现有查询部分字段的情况&#xff0c;网上逛了半天&#xff0c;发现都是抄来抄去的“古文”。于是用英文搜索了下&#xff0c;总结了以下几点。 版本信息&#xff1a;Spr…

Spring Boot + Redisson 封装分布式锁

目标&#xff1a;一行代码调用&#xff0c;简单粗暴。 基操&#xff1a;自动加锁&#xff0c;自动解锁&#xff0c;自动处理异常&#xff0c;自动处理锁超时等。 安装 redis redisson <dependency><groupId>org.springframework.boot</groupId><artifac…

使用Python可视化有压缩格式的Bitmap(BMP)图像调色板数据

使用Python可视化有压缩格式的Bitmap BMP图像调色板数据 参考文章一、调色板数据二、测试代码三、测试结果 参考文章 有压缩格式的Bitmap(BMP)图像显示调色板数据和图像数据Bitmap(BMP)图像信息分析主要说明带压缩的形式Bitmap(BMP)图像信息验证 一、调色板数据 Color Palette…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…

Day62 图论part11

Floyd 算法精讲 Floyd 算法代码很简单&#xff0c;但真正理解起原理 还是需要花点功夫&#xff0c;大家在看代码的时候&#xff0c;会发现 Floyd 的代码很简单&#xff0c;甚至看一眼就背下来了&#xff0c;但我为了讲清楚原理&#xff0c;本篇还是花了大篇幅来讲解。 代码随想…

html+css+js网页设计 美食 美食家6个页面

htmlcssjs网页设计 美食 美食家6个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xf…

21. 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--补充--自动添加角色可访问接口

上一篇文章我们一起编写了自动添加接口地址&#xff0c;这一篇文章我们补充简易权限中的自动添加角色可访问接口。 一 实现 首先&#xff0c;我们Initialization文件夹下新建AddRolePath类&#xff0c;这个类用于初始化数据库中SysRoleUrl表&#xff0c;代码如下&#xff1a;…

标准库以及HAL库——按键控制LED灯代码

按键控制LED本质还是控制GPIO,和点亮一个LED灯没什么区别 点亮一个LED灯&#xff1a;是直接控制输出引脚&#xff0c;GPIO初始化推挽输出即可 按键控制LED&#xff1a;是按键输入信号从而控制输出引脚&#xff0c;GPIO初始化推挽输出一个引脚以外还得加一个GPIO上拉输入 但是…

关于Camunda工作流的使用后的记录

服务器机器2台&#xff0c;8u32G 服务器负载长期极低,近30日监控数据&#xff0c;CPU 1分钟负载高峰时不到0.2 数据库机器单台&#xff0c;4u16G 数据库总连接数&#xff1a;最大值47&#xff0c;最小值16 CPU使用率&#xff1a;最大值25.7%&#xff0c;最小值6% IOPS(单位时间…

Java的list中状态属性相同返回true的实现方案

文章目录 项目背景方案一、for循环实现实现思路 方案二、stream实现实现思路 项目背景 在项目中会遇到list中多个状态判断&#xff0c;状态值相等时&#xff0c;总体返回为true。 方案一、for循环实现 实现思路 遍历list&#xff0c;当出现不一致时&#xff0c;直接跳出循环…

模型选择+过拟合欠拟合

训练误差和泛化误差 训练误差&#xff1a;模型在训练数据上的误差 泛化误差&#xff1a;模型在新数据上的误差 验证数据集&#xff1a;一个用来评估模型好坏的数据集 例如拿出50%的数据作为训练 测试数据集&#xff1a;只能用一次 K则交叉验证 在没有足够数据时使用 算法…

Web安全攻防入门教程——hvv行动详解

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中&#xff0c;保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现&#xff0c;还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻防…

Qt仿音乐播放器:QFileDialog添加本地文件

一、套路 QFileDialog fileDialog(this);// 创建对话框&#xff0c;并设置父元素&#xff1b;fileDialog.setWindowTitle("添加本地下载的音乐");//设置窗口标题//设置文件对话框的默认打开路径 QString projectPathQDir::currentPath();//获取当前目录 QDir dir(pr…

语音识别基础算法——动态时间规整算法

前言 动态时间规整算法&#xff0c;Dynamic Time Wraping&#xff0c;缩写为DTW&#xff0c;是语音识别领域的一个基础算法。 算法的提出 DTW 的提出是为了解决或尽量解决在语音识别当中的孤立词识别不正确的问题。该问题简单描述为&#xff1a;在识别阶段&#xff0c;将输入…

SAP SD信贷管理信用管理手册(下)

1、项目类别的信贷激活 图1-12-1.项目类别的信贷设置路径 图1-12-2.项目类别的信贷参数激活 说明&#xff1a;项目类别是否进行信贷管理设置。 2、定义信贷组 图1-13-1.定义信贷组路径 图1-13-2.信贷组定义 说明&#xff1a;信贷组参与后续信贷控制的组合分配。 3、销售凭证及…

分布式项目___某污水处理项目

一.分布式项目___污水处理项目 项目地址:https://gitee.com/yanyigege/collaborative-water-springboot.git ​ 1.项目背景 总公司在全国各地有处理污水的项目部,各项目部处理自己的污水,总部需要监控各地分项目部每天处理污水的原料用量,掌握各分部的污水处理情况 ​ 2.功…

网页排名:PageRank 算法的前世今生

PageRank算法全解析&#xff1a;从理论到实践 引言 PageRank 是由拉里佩奇&#xff08;Larry Page&#xff09;和谢尔盖布林&#xff08;Sergey Brin&#xff09;在1996年发明的一种链接分析算法&#xff0c;最初用于Google搜索引擎来评估网页的重要性。该算法通过模拟随机浏览…

Nginx详细安装配置过程

目录 1.nginx环境准备 1.1 在配置好yum源之后&#xff0c;安装如下的编译工具 1.2 安装nginx所需的依赖库 1.3 关闭防火墙&#xff0c;selinux&#xff0c;并确保网络正常 2.nginx的编译安装 2.1从nginx官网复制下载链接&#xff0c;wget 下载 2.2? 解压nginx源代码 2…

滴滴数据分析80道面试题及参考答案

如何衡量分类好坏? 衡量分类好坏有多种方法,常用的有准确率、精确率、召回率、F1 值、ROC 曲线与 AUC 值等。 准确率:是指分类正确的样本数占总样本数的比例,计算公式为:准确率 = (分类正确的样本数)/(总样本数)。准确率越高,说明分类器整体的分类效果越好,但在正负…

C语言内存管理函数

面试里会遇到让自己编写一个内存管理函数 1. memset 将指定的内存区域的每个字节设置为指定的值 函数原型: void *memset(void *s, int c, size_t n); 参数: s: 指向要填充的内存块的指针。c: 要设置的值&#xff08;会被转换为无符号字符&#xff09;。n: 要设置的字节数。…