【C++ 面试 - 面向对象】每日 3 题(一)

ops/2024/9/20 7:27:42/ 标签: 面试, 职场和发展, 后端, 开发语言, c++

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/fYaBd

📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

1. 介绍面向对象的三大特性,并且举例说明

三大特性:继承、封装和多态

(1)继承

让某种类型对象获得另一个类型对象的属性和方法。

它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

常见的继承有三种方式:

  1. 实现继承:指使用基类的属性和方法而无需额外编码的能力

  2. 接口继承:指仅使用属性和方法的名称、但是子类必须提供实现的能力

  3. 可视继承:指子窗体(类)使用基窗体(类)的外观和实现代码的能力(C++里好像不怎么用)

例如,将人定义为一个抽象类,拥有姓名、性别、年龄等公共属性,吃饭、睡觉、走路等公共方法,在定义一个具体的人时,就可以继承这个抽象类,既保留了公共属性和方法,也可以在此基础上扩展跳舞、唱歌等特有方法。

继承的好处:

  • 代码的复用。

  • 通过继承,在基类里面给所有派生类可以保留统一的纯虚函数接口,等待派生类进行重写,通过使用多态,可以通过基类的指针访问不同派生类对象的同名覆盖方法。

(2)封装

数据和代码捆绑在一起,避免外界干扰和不确定性访问。

封装是指将数据(属性)和操作数据的方法(函数)封装在一个单元中,这个单元就是类。封装的主要目的是隐藏类的内部实现细节,只暴露必要的接口给外部使用者。

优点:

  • 信息隐藏:封装可以将类的内部细节隐藏起来,不暴露给外部,提高了安全性和防止误用。

  • 简化接口:封装通过提供清晰的接口简化了类的使用,使用者只需关注如何使用接口而不需要了解内部实现。

  • 提高可维护性:内部实现的修改不会影响外部使用者,从而提高了代码的可维护性。

(3)多态

同一事物表现出不同事物的能力,即向不同对象发送同一消息,不同的对象在接收时会产生不同的行为(重载实现编译时多态,虚函数实现运行时多态)

多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单一句话:允许将子类类型的指针赋值给父类类型的指针

实现多态有二种方式:覆盖(override),重载(overload)。

  • 覆盖:是指子类重新定义父类的虚函数的做法。

  • 重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。例如:基类是一个抽象对象——人,那教师、运动员也是人,而使用这个抽象对象既可以表示教师、也可以表示运动员。

另外,还有多态的几个关键概念和特性:

  1. 虚函数(Virtual Functions):通过将函数声明为虚函数,可以实现动态绑定。虚函数是在基类中声明,并在派生类中重新定义的函数。在运行时,根据对象的实际类型确定调用哪个函数的过程就是动态绑定。

  2. 纯虚函数(Pure Virtual Functions):纯虚函数是一种在基类中声明但没有具体实现的虚函数。它的目的是为了在基类中提供一个接口,要求派生类必须实现这个函数,从而使基类成为抽象类。抽象类不能被实例化,只能用作派生类的基类。

  3. 虚析构函数(Virtual Destructors):虚析构函数用于确保使用基类指针删除派生类对象时,会始终正确地调用派生类的析构函数。当使用基类指针指向派生类对象并进行delete操作时,如果基类的析构函数不是虚的,将只会调用基类的析构函数,而派生类的析构函数不会被调用,可能导致资源泄漏。

  4. 运行时类型识别(Run-time Type Identification,RTTI):RTTI允许在运行时检查和识别对象的实际类型。C++中的两个RTTI运算符是dynamic_cast和typeid。dynamic_cast用于安全地将基类指针或引用转换为派生类指针或引用,typeid用于返回对象类型的信息。

  5. 虚函数表(Virtual Function Table,vtable):当一个类包含虚函数时,编译器会为该类创建一个虚函数表,也称为vtable。vtable是一个函数指针数组,存储了虚函数的地址。每个对象拥有一个虚函数表指针,指向该对象所属类的虚函数表。通过虚函数表,实现了在运行时动态查找和调用正确的虚函数。

2. 面向对象有哪些原则

面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它基于对象的概念,通过封装、继承和多态来组织代码。面向对象编程中有一些重要的原则和理念,以下是其中一些常见的原则:

  1. 单一职责原则(Single Responsibility Principle,SRP):一个类应该只有一个引起它变化的原因,即一个类应该只有一个职责。这个原则指导我们将功能拆分到小而清晰的类中,使每个类只负责一个明确定义的任务。

  2. 开放封闭原则(Open-Closed Principle,OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这个原则鼓励使用抽象和接口来定义可扩展的模块,而避免修改现有代码。

  3. 里氏替换原则(Liskov Substitution Principle,LSP):任何基类的实例都可以被其派生类的实例替换而不改变程序的正确性。这个原则强调继承关系的正确使用,派生类应该能够无缝地被用于基类的场景。

  4. 接口隔离原则(Interface Segregation Principle,ISP):客户端不应该被迫依赖它们不使用的接口。该原则鼓励设计小而专注的接口,而不是一个臃肿庞大的接口,从而提高代码的内聚性和可维护性。

  5. 依赖倒置原则(Dependency Inversion Principle,DIP):高层模块不应该直接依赖低层模块,而是依赖于抽象。这个原则强调使用抽象(接口或抽象类)来定义模块之间的依赖关系,降低模块间的耦合性。

  6. 迪米特法则(Law of Demeter,LoD):一个对象应该对其他对象尽量少的了解。这个原则鼓励尽量将对其他对象的依赖限制在最小范围内,通过封装和间接访问来降低对象之间的耦合度。

这些原则都旨在帮助设计和构建具有高内聚性、低耦合性和易于维护的面向对象系统。当我们在实践中遵守这些原则时,可以提高代码的可扩展性、重用性和可维护性,以及减少错误和改动的影响范围。

3. 面向对象和基于对象的编程思想是什么?

  1. 面向对象编程 (OOP):

    1. OOP 是一种编程范式,它将数据(称为对象)和操作数据的方法(称为方法或函数)组合在一起,以创建一个具有特定行为和属性的对象。OOP 的核心概念包括类、对象、继承、封装和多态。

    2. OOP 中,数据和方法通常封装在类中,类是对象的模板,对象是类的实例。通过类,可以创建多个对象,每个对象具有相同的属性和方法,但其数据可能不同。

    3. OOP 的主要目标是模拟现实世界中的实体和它们之间的关系,以更容易地设计和维护复杂的系统。

  2. 基于对象编程 (Object-Based Programming):

    1. 基于对象编程是一种相对简化的编程思想,它强调使用对象来组织和处理数据,但不一定涉及到所有的面向对象编程概念。

    2. 基于对象编程可以包含类和对象,但不一定包括继承和多态等高级概念。通常,它更关注对象的创建、属性设置和方法调用,而不涉及复杂的继承层次和多态行为。

总结:面向对象编程是一种更全面、更复杂的编程范式,它涵盖了面向对象思想的所有核心概念,包括继承、封装、多态等。基于对象编程则是一种更简单的编程思想,更侧重于使用对象来组织和处理数据,但不一定涉及到所有的面向对象概念。选择哪种编程思想取决于项目的需求和复杂性。


http://www.ppmy.cn/ops/98483.html

相关文章

博立的个人代表作品集锦

1. 比赛同创 国一_2023年全国大学生电子设计竞赛 【信号分离装置】 国二_2023年全国大学生集成电路创新创业大赛半决赛作品(robei赛道) 【基于robei EDA的可重构无线控制小车设计】 省一_2022年重庆市大学生电子设计竞赛 【混沌信号发生装置】 国…

黑神话悟空苹果电脑可以玩吗?MacBook玩黑神话悟空游戏攻略 crossover软件永久激活码分享 crossover免费使用教程

《黑神话:悟空》是由游戏科学公司制作的以中国神话为背景的动作角色扮演游戏,在发行前已备受期待。8月20日10时,备受期待的国产3A游戏大作《黑神话:悟空》正式上线,开售不到一小时,Steam平台上便涌入104.5万…

安装docker+docker远程连接

docker Docker 是⼀个开源的应⽤容器引擎,可以实现虚拟化,完全采⽤“沙盒”机制,容器之间不会存在任何接⼝。 docker架构 docker核心概念 1. 镜像(images):⼀个⾯向 docker 容器引擎的只读模板,…

PS 笔记

PS(Photoshop)是一款由Adobe公司开 发的软件,广泛用于图像处理、图形设 计、网页制作等领域。下面将对PS的一些 基本操作、功能和技巧进行总结,以供参考: 界面:PS的界面包含工具栏、选项栏、 面板、画布等部分,熟悉界面布局对操作很重要…

用GO开发的桌面端软件如何控制只运行一个实例

我们在运行GO开发的桌面端软件时,经常遇到一个需求,就是只允许一个实例运行,比如一个游戏,我们只允许一个实例运行,防止多个实例同时运行,导致游戏卡顿。 然而如果我们不做任何处理,只要我们双…

RabbitMQ高级用法

💥 该系列属于【SpringBoot基础】专栏,如您需查看其他SpringBoot相关文章,请您点击左边的连接 目录 一、发送者的可靠性 1. 生产者重试机制 2. 生产者确认机制【return和confirm机制】 (1)开启生产者确认 &#x…

打卡学习Python爬虫第二天|数据解析Re 正则表达式

在前面的学习中,我们已经基本掌握了抓取整个网页的基本技能,但是在实际的需求当中,我们不需要整个网页的内容,只需要一小部分。这就涉及到数据提取的问题。 三种数据解析的方式:可混合使用 1、re解析 2、bs4解析 3…

js监听鼠标单击和双击事件,冲突问题处理

在浏览器中,单击事件通常会在双击事件之前触发,因此在处理单击和双击事件时,双击操作往往会先触发一次单击事件,这会导致意外的行为。 要解决这个问题,可以通过延迟处理单击事件,给浏览器一些时间来判断用…

flv和 rtmp视频负载类型的差异

FLV中的视频类型标记 FLV文件和流中的视频类型通过"VideoTag"中的几个关键字段来标记: Frame Type: 表示帧的类型,比如关键帧或差异帧。 CodecID: 表示使用的编解码器类型。例如: 2代表Sorenson H.2633代表Screen Video4代表On2 …

运维学习————Linux环境下Tomcat的部署

目录 一、环境准备 二、 启动测试 三、访问端口修改 四、部署web项目 1、材料准备 2、部署 2.1、上传war包到webapps目录下 2.2、修改项目配置 2.3、浏览器访问 引申 一、环境准备 tomcat安装包:apache-tomcat-9.0.52 JDK环境: 我使用的y…

Java开发程序员职业发展路径

入行阶段:后端 3年 目标 在这一阶段,你将专注于后端开发,特别是Java编程语言及其相关技术栈。 主要任务和技能 掌握Java基础: 理解Java语言的核心概念,如OOP(面向对象编程)、数据结构、算法等。学习后端…

基于Springboot教学管理系统pf

TOC springboot507基于Springboot教学管理系统pf 第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。随着电脑和笔记本…

day52-graph theory-part03-8.23

tasks for today: 1. 101.孤岛总面积 2. 102.沉默孤岛 3. 103.水流问题 4. 104.建造最大岛屿 -------------------------------------------------------------------------------------- 1. 101.孤岛总面积 pay attention to the requirement, it is not calculating the…

UE5.4 - 下载和安装

一. 简介 虚幻引擎(Unreal Engine)是由 Epic Games 公司推出的一款功能强大的游戏开发引擎。它于 1998 年推出第一代,其口号是 “全球最开放、最先进的实时 3D 创作工具”。 虚幻引擎被广泛应用于游戏产业,创作出了众多知名的 3…

【SpringBoot】优化慢启动应用的用户体验

通过深入分析SpringBoot中WebServer的启动流程,插入自定义的Loading页面展示逻辑,优化软件使用时的用户体验。 背景 Java本身的特点,再加上开发人员能力差,软件开发工程化程度低等等问题,经过一段时间的迭代之后&…

Vue的生命周期了解

目录 1.何为Vue的生命周期 2.Vue2生命周期阶段 (1)beforeCreate(创建前) (2)created(创建后) (3)beforeMount(挂载前) (4)mounted(挂载后) (5)beforeU…

推荐一个完全自由的目录设计网站

引言 如果我们能通过网站出一本书,这将是一件很酷的事。 事实上,我们通过网站发布知识,最常见的是写博客。 这二者有什么区别呢? 书本的知识内容有很强的逻辑性、系统性。而博客是随心所欲的,一时灵感来了就写一篇…

「UCD」用户体验设计专家

VOC 设计系统的作用及建立方式?用户画像的作用和创建方法?如何评估产品的用户体验?一、设计系统的作用及建立方式 设计系统(Design System)是一套标准化的视觉和交互指南,旨在确保产品设计的一致性和高效性。它不仅可以提高设计与开发团队之间的协作效率,还可以为用户带…

【前端基础篇】CSS基础速通万字介绍(下篇)

文章目录 前言背景属性背景颜色背景图片背景平铺背景位置背景尺寸 圆角矩形生成圆形生成圆角矩形 Chrome调试工具打开方式标签页含义elements标签页使用 元素显示模式块级元素行内元素/内联元素行内元素和块级元素的区别 盒模型边框内边距外边距 块级元素水平居中去除浏览器默认…

Baumer工业相机堡盟工业相机如何通过BGAPISDK初始化时过滤其它非Baumer相机(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK初始化时过滤其它非Baumer相机(C) Baumer工业相机Baumer工业相机通过SDK初始化时过滤其它非Baumer相机的技术背景通过SDK过滤其它非Baumer相机的代码分析1、引用合适的类文件2、初始化时过滤其它非Baumer相机…