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.rhkb.cn/news/496571.html

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

相关文章

TDengine 新功能 VARBINARY 数据类型

1. 背景 VARBINARY 数据类型用于存储二进制数据&#xff0c;与 MySQL 中的 VARBINARY 数据类型功能相同&#xff0c;VARBINARY 数据类型长度可变&#xff0c;在创建表时指定最大字节长度&#xff0c;使用进按需分配存储&#xff0c;但不能超过建表时指定的最大值。 2. 功能说明…

rust windwos 两个edit框

use winapi::shared::minwindef::LOWORD; use windows::{core::*,Win32::{Foundation::*,Graphics::Gdi::{BeginPaint, EndPaint, PAINTSTRUCT},System::LibraryLoader::GetModuleHandleA,UI::WindowsAndMessaging::*,}, };// 两个全局静态变量&#xff0c;用于保存 Edit 控件的…

代码随想录Day51 99. 岛屿数量,99. 岛屿数量,100. 岛屿的最大面积。

1.岛屿数量深搜 卡码网题目链接&#xff08;ACM模式&#xff09;(opens new window) 题目描述&#xff1a; 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接…

邮箱手机号脱敏

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 输入框的脱敏&#xff0c;当输入的时候显示正常&#xff0c;失去焦点部分显示**** 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 脱敏可以封装 一下成为一个方法&#xff0c;挂…

C语言----变量与常量

目录 变量 变量的分类 常量 分类&#xff1a; 1. 字符型常量 2. 字符串常量 3. 整形常量 4. 浮点型常量 5. 指数常量 6. 标识常量 变量 概念&#xff1a;在程序运行中发生改变的量 定义格式&#xff1a; 存储类型(一般存储类型是可以省略的) 数据类型 变量名 aut…

SQLite本地数据库的简介和适用场景——集成SpringBoot的图文说明

前言&#xff1a;现在项目普遍使用的数据库都是MySQL&#xff0c;而有些项目实际上使用SQLite既足矣。在一些特定的项目中&#xff0c;要比MySQL更适用。 这一篇文章简单的介绍一下SQLite&#xff0c;对比MySQL的优缺点、以及适用的项目类型和集成SpringBoot。 1. SQLite 简介 …

线性代数行列式

目录 二阶与三阶行列式 二元线性方程组与二阶行列式 三阶行列式 全排列和对换 排列及其逆序数 对换 n阶行列式的定义 行列式的性质 二阶与三阶行列式 二元线性方程组与二阶行列式 若是采用消元法解x1、x2的话则得到以下式子 有二阶行列式的规律可得&#xff1a;分…

闲谭Scala(3)--使用IDEA开发Scala

1. 背景 广阔天地、大有作为的青年&#xff0c;怎么可能仅仅满足于命令行。 高端大气集成开发环境IDEA必须顶上&#xff0c;提高学习、工作效率。 开整。 2. 步骤 2.1 创建工程 打开IDEA&#xff0c;依次File-New-Project…&#xff0c;不好意思我的是中文版&#xff1a;…

http 请求总结get

关于get请求传递body的问题 错误代码 有400 , 415 等情况 <!doctype html><html lang"zh"><head><title>HTTP Status 400 – 错误的请求</title><style type"text/css">body {font-family:Tahoma,Arial,sans-seri…

CCF-GESP 等级考试 2023年12月认证C++五级真题解析

2023年12月真题 一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 正确答案&#xff1a;C 考察知识点&#xff1a;算法 解析&#xff1a;fiboA 是很好理解的&#xff0c;但是执行效率不高&#xff0c;有的计算是重复的&#xff0c;导致效率低。 正确答案&#xf…

Vscode + gdbserver远程调试开发板指南:

本章目录 步骤环境准备网络配置vscode配置步骤 (全图示例)开发板配置开始调试注意: 每次断开之后&#xff0c;开发板都需要重新启动gdbserver才可调试。 参考链接: 步骤 环境准备 将交叉编译链路径加入$PATH变量&#xff1a;确保系统能够找到所需的工具。 export PATH$PATH:/p…

Docker【初识Docker】

目录 为什么会出现Docker这门技术喃&#xff1f; 应用开发和部署的困境 容器技术的先兆 Docker 的出现&#xff1a;简化容器化 Docker 技术的关键创新&#xff1a; Docker 的广泛应用和变革 什么是 Docker&#xff1f; Docker的历史 早期背景&#xff1a;容器化和虚拟化…

金融租赁系统的发展与全球化战略实施探讨

内容概要 金融租赁系统的演变并非一帆风顺&#xff0c;像一场跌宕起伏的电影。首先&#xff0c;咱们得看看它的起源及现状。随着经济的快速发展&#xff0c;金融租赁逐渐作为一种灵活的融资手段崭露头角。在中国市场中&#xff0c;企业对设备和技术更新换代的需求日益迫切&…

畅游 Linux 开发天地:yum 与 vim 详解

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; &#x1f6a9;用通俗易懂且不失专业性的文字&#xff0c;讲解计算机领域那些看似枯燥的知识点&#x1f6a9; 前言 在当今数字…

C++--------继承

一、继承的基本概念 继承是 C 中的一个重要特性&#xff0c;它允许一个类&#xff08;派生类或子类&#xff09;继承另一个类&#xff08;基类或父类&#xff09;的属性和方法。这样可以实现代码的重用和建立类之间的层次关系。 #include <iostream>// 基类 class Base…

Doris的SQL原理解析

今天来介绍下Doris的SQL原理解析&#xff0c;主要从语法、解析、分析、执行等几个方面来介绍&#xff0c;可以帮助大家对Doris底层有个清晰的理解~ 一、Doris简介 Apache Doris是一个基于MPP架构的高性能、实时的分析型数据库&#xff0c;能够较好的满足报表分析、即席查询、…

HarmonyOS NEXT 实战之元服务:静态多案例效果(一)

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1代码案例如下&#xff1a; import { authentication } from…

Elasticsearch:normalizer

一、概述 ‌Elastic normalizer‌是Elasticsearch中用于处理keyword类型字段的一种工具&#xff0c;主要用于对字段进行规范化处理&#xff0c;确保在索引和查询时保持一致性。 Normalizer与analyzer类似&#xff0c;都是对字段进行处理&#xff0c;但normalizer不会对字段进…

零基础微信小程序开发——页面导航之编程式导航(保姆级教程+超详细)

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

计算机网络 (10)网络层

前言 计算机网络中的网络层&#xff08;Network Layer&#xff09;是OSI&#xff08;开放系统互连&#xff09;模型中的第三层&#xff0c;也是TCP/IP模型中的第二层&#xff0c;它位于数据链路层和传输层之间。网络层的主要任务是负责数据包从源主机到目的主机的路径选择和数据…