继承和多态中的常见笔试面试题(一)

1. 下面哪种面向对象的方法可以让你变得富有( B )
A: 继承 B: 封装 C: 多态 D: 抽象

真·趣味题)a,期望你爸是李刚,但李刚未必有钱;乐观者选c,多态是在面向对象语言中,接口的多种不同的实现方式,保持开放的心态和广泛的人脉;有想 法的人选b,封装是在程序上,隐藏对象的属性和实现细节,仅对外公开接口,因其垄断,所以最有发财可能;梦幻者选d。 


2. ( D )是面向对象程序设计语言中的一种机制。这种机制实现了方法的定义与具体的对象无关,
而对方法的调用则可以关联于具体的对象。
A: 继承 B: 模板 C: 对象的自身引用 D: 动态绑定

多态有两种:一种是函数重载实现静态绑定;一种是虚函数实现动态绑定


3. 面向对象设计中的继承和组合,下面说法错误的是?( C
A:继承允许我们覆盖重写父类的实现细节,父类的实现对于子类是可见的,是一种静态复
用,也称为白盒复用
B:组合的对象不需要关心各自的实现细节,之间的关系是在运行时候才确定的,是一种动
态复用,也称为黑盒复用
C:优先使用继承,而不是组合,是面向对象设计的第二原则
D:继承可以使子类能自动继承父类的接口,但在设计模式中认为这是一种破坏了父类的封
装性的表现


4. 以下关于纯虚函数的说法,正确的是( A )
A:声明纯虚函数的类不能实例化对象 B:声明纯虚函数的类是虚基类
C:子类必须实现基类的纯虚函数 D:纯虚函数必须是空函数

声明纯虚函数的类是抽象类,虚基类虚拟继承中共享的基类;子类不一定要实现基类的虚基函数,只是子类重写这个虚基函数后才能正确的实例化出对象;空函数是不执行任何语句就返回的函数,显然纯虚函数不是空函数


5. 关于虚函数的描述正确的是( B )
A:派生类的虚函数与基类的虚函数具有不同的参数个数和类型 B:内联函数不能是虚函数
C:派生类必须重新定义基类的虚函数 D:虚函数可以是一个static型的函数

派生类的虚函数重写必须遵循三同:虚函数名,返回值,参数类型和个数,只有在协同的特殊情况下,返回值可以为父子类关系;inline 修饰的函数使用 virtual 修饰后,地址就会被放到虚表中去,因此不再具有内联特性;派生类可以不重新定义基类的虚函数;虚函数是通过对象的 this 指针来调用的,而 static 修饰的函数是属于这个类的,与任何实例对象都不相关。


6. 关于虚表说法正确的是(
A:一个类只能有一张虚表
B:基类中有虚函数,如果子类中没有重写基类的虚函数,此时子类与基类共用同一张虚表
C:虚表是在运行期间动态生成的
D:一个类的不同对象共享该类的虚表

多继承中可能会有多个虚表;子类如果没有重写虚函数,会将父类的虚表拷贝下来,且虚表是在编译阶段生成的,只是虚函数表指针是在运行时被赋值的,虚表是属于这个类的,实例化出的对象共用这个虚表


7. 假设A类中有虚函数,B继承自A,B重写A中的虚函数,也没有定义任何虚函数,则( D
A:A类对象的前4个字节存储虚表地址,B类对象前4个字节不是虚表地址
B:A类对象和B类对象前4个字节存储的都是虚基表的地址
C:A类对象和B类对象前4个字节存储的虚表地址相同
D:A类和B类虚表中虚函数个数相同,但A类和B类使用的不是同一张虚表

每个类都有自己独有的虚表,用自己的虚函数表指针来访问,地址都是不一样的。

8. 什么是菱形继承?菱形继承的问题是什么?

菱形继承是是多继承的一种特殊情况:当一个子类(派生类)直接或间接同时继承了两个父类(基类),而这个两个父类(基类)又直接或间接继承自同一个父类(基类),从而形成了一份菱形的继承关系。

问题:菱形继承中,派生类(子类)存储了两份基类(父类)数据的问题,会导致数据访问的二义性问题(不明确访问的是哪一个),和数据冗余问题(同一份数据存了两份)

9. 什么是菱形虚拟继承?如何解决数据冗余和二义性的

在继承中使用虚拟继承来解决菱形继承导致的一些问题。

如何解决:在虚拟继承发生菱形继承的派生类的基类中,每个基类在虚拟继承时都添加了一个指针,这个指针指向一个表,叫虚基表,虚基表中存储的是基础基类的成员相对于这两个指针的偏移量,利用这两个虚表中的偏移量通过指针访问的是同一个基础基类的成员变量。访问的是同一个成员,就解决数据二义性的问题;只存一份,通过指针指向虚表的偏移量去访问,就解决了数据冗余问题。

10. 继承和组合的区别?什么时候用继承?什么时候用组合?

继承是一种 is - a 的关系,即每一个派生类对象都是一个基类对象;而组合是一种 has - a 的关系,如果类 A 组合了类 B,那么每一个 A 对象中都有一个 B 对象。继承是一种白箱复用,父类的内部细节大多对子类是透明的,耦合度较高;组合是一种黑箱复用,另一个类的内部细节在组合时被隐藏,类之间没有很强的依赖关系,耦合度低,利于类的封装。

当两个类之间符合 is - a 的关系时用继承(学生(子类)是人(父类));当两个类之间的关系符合 has - a 的关系时用组合。使用继承还是组合具体取决于两个类之间的关系,适合什么用什么,如果两个关系都符合,优先使用组合,可维护性较高!

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

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

相关文章

【SpringBoot】分组校验和自定义校验

分组检验 参数校验时,我们希望不同的方法参数校验规则不同,这时就需要分组校验。 public class Category {NotNull(groups Update.class)private Integer id;//主键IDNotEmptyprivate String categoryName;//分类名称// NotEmpty(groups {Add.class,…

基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码

基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于闪电搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

机器学习实践

1.波士顿房价预测 波士顿房屋的数据于1978年开始统计,共506个数据点,涵盖了波士顿不同郊区房屋的14种特征信息。 在这里,选取房屋价格(MEDV)、每个房屋的房间数量(RM)两个变量进行回归&#xff…

解决报错Exception encountered during context initialization

推荐阅读 智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) 文章目录 推荐阅读报错解决 报错 今天在测试一个类时,突然间报了以下错误。 juni…

LeetCode_2_中等_两数相加

文章目录 1. 题目2. 思路及代码实现(Python)2.1 模拟迭代2.2 递归 1. 题目 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c…

自定义异常相关问题及答案(2024)

1、为什么要使用自定义异常? 使用自定义异常(Custom Exceptions)在程序设计中是一个良好的实践,它有几个重要的好处: 提高代码可读性: 自定义异常的名称如果能清晰表达出异常的情况,那么阅读代…

4.将新对象的地址版给pveg变量:

string "pveg - now. Btrangt"Cabbage Heads Hone*): 1.为对象分配内存: 2. 请用类构造函数,它 为“Cabbnge Heads Hose 分配空间 - # "Cabbage Heads Hoe" 复制到分配的内存单元中 - #f "Cabbage Heads Howe" 的地址赋给str 将值19粒给1en 更…

vmware安装centos 7.6 操作系统

vmware安装centos 7.6 操作系统 1、下载centos 7.6 操作系统镜像文件2、安装centos 7.6操作系统3、配置centos 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载centos 7.6 操作系统镜像文件 这里选择 2018年10月发布的 7.6 版本 官方下载链…

vscode安装Prettier插件,对vue3项目进行格式化

之前vscode因为安装了Vue Language Features (Volar)插件,导致Prettier格式化失效,今天有空,又重新设置了一下 1. 插件要先安装上 2. 打开settings.json {"editor.defaultFormatter": "esbenp.prettier-vscode","…

【物联网】手把手完整实现STM32+ESP8266+MQTT+阿里云+APP应用——第3节-云产品流转配置

🌟博主领域:嵌入式领域&人工智能&软件开发 本节目标:本节目标是进行云产品流转配置为后面实际的手机APP的接入做铺垫。云产品流转配置的目的是为了后面能够让后面实际做出来的手机APP可以控制STM32/MCU,STM32/MCU可以将数…

前缀和算法模板

一维前缀和 算法用途:快速求出数组中某一连续区间的和 一维前缀和算法模板 1、预处理出一个 dp 数组 要求原数组存储在 n 1 的空间大小中,其中后 n 个空间存数据。 dp数组,数组开 n 1个空间,dp[i] 表示 [ 1, i ] 区间内所有…

抖店如何高效率起店?从0到1的起店思路和心得,分享如下!

我是王路飞。 万事开头难,我为什么一直强调让新手商家先入门,把流程跑通呢? 就好像我们上学时候考试,都知道100分很难,那我们就先从60分开始好了,有了考60分的基础,你就知道你跟100分的差距在…

【Android】自定义View组件,并实现在 Compose、Kotlin、Xml 中调用

从事 Android 开发以来,很少有过自定义 View 的相关开发需求,大部分 UI 都是可以集成某些官方组件,在组件的基础上完成能够大大缩短开发时间。但今天我要讲的是:如何使用 Android 开发一个Compose、Xml都可以调用的组件&#xff1…

JavaScript异常处理详解

​​​​​​​一、异常的捕获 1.1 基本的try…catch语句 ES3开始引入了 try-catch 语句&#xff0c;是 JavaScript 中处理异常的标准方式。 语法&#xff1a; try{ //可能发生异常的代码 }catch(error){ //发生错误执行的代码 } 看下面的代码&#xff1a; <script>tr…

【深度学习程序实例】

以下是一个使用Python编写的深度学习程序实例&#xff0c;用于训练一个简单的神经网络来分类手写数字&#xff1a; import tensorflow as tf from tensorflow.keras.datasets import mnist# 加载MNIST数据集 (x_train, y_train), (x_test, y_test) mnist.load_data()# 数据预…

【.NET Core】异步编程模式

【.NET Core】异步编程模式 文章目录 【.NET Core】异步编程模式一、概述二、基于任务的异步模式&#xff08;TAP&#xff09;2.1 TAP模式命名、参数和返回类型2.2 TAP初始化异步操2.3 TAP如何编译2.4 手动生成TAP方法2.5 混合方法实现TAP2.6 TAP中Await挂起执行2.7 TAP中使用Y…

记一次canal除坑记录

记一次canal除坑记录 错误信息 Caused by :com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table 问题处理 今天对Canal相关程序进行升级&#xff0c;原监听的表及业务都正常&#xff1b;遇到新增加的表时总是不走&#xff1b;…

202402读书笔记|《当你老了》——灰蒙曙光比爱情温柔,清晨露珠比希望更可爱

202402读书笔记|《当你老了》——灰蒙曙光比爱情温柔&#xff0c;清晨露珠比希望更可爱 《当你老了》作者叶芝&#xff0c;断断续续碎片时间读完的一本书&#xff0c;不是很惊艳&#xff0c;但值得一读。就因为很喜欢当你老了&#xff0c;所以拾起的这本书。读完知道了原来叶芝…

什么是软件安全性测试?如何进行安全测试?

一、什么是软件安全性测试&#xff1f; 软件安全性测试是指对软件系统中的安全漏洞进行检测和评估的过程。其目的是为了确保软件系统在面对各种安全威胁时能够保持其功能的完整性、可用性和机密性。 二、软件安全性测试可以通过以下几个步骤来进行&#xff1a; 1. 需求分析&a…

[实践总结] 限制正则表达式匹配次数/时间 防止DoS攻击

思路 1、优化正则表达式 2、正则表达式无法优化的话&#xff0c;可以考虑限制匹配次数&#xff0c;或者限制匹配时间 限制 匹配次数 public class CountedCharSequence implements CharSequence {private final CharSequence charSequence;private long count;public Counte…