每日一面——封装、继承和多态

写前声明:参考链接 C++面经、面试宝典 等

✊✊✊每日一面——封装、继承和多态

    • 一、简述一下什么是面向对象?
    • 二、讲一讲封装、继承、多态是什么?
    • 三、C++的多态怎么实现?
    • 四、C++中类成员的访问权限和继承权限问题
    • 五、C++中的重载、重写(覆盖)和隐藏的区别
    • 六、知道C++中的组合吗?它与继承相比有什么优缺点吗?

一、简述一下什么是面向对象?

  • 面向对象是一种编程思想,把一切东西看出是一个个对象,它们各自有各自的属性,把这些对象拥有的属性变量和操作这些属性的函数打包成一个类来表示
  • 面向对象和面向过程的区别
    • 面向过程:根据业务逻辑从上到下写代码
    • 面向对象:将数据与函数绑定到一起,进行封装,这样能够快速的开发程序,减少重复代码的重写过程

二、讲一讲封装、继承、多态是什么?

  • 封装: 将具体实现过程和数据封装成一个函数,只能通过接口进行访问,降低耦合度,使类成为一个具有内部数据的自我隐藏能力、功能独立的软件模块

    • 意义:保护或者防止代码在无意间被破坏,保护类中的成员,不让类中以外的程序直接访问或者修改,只能通过提供的公用接口访问
  • 继承: 子类继承父类的特征和行为,复用了基类的全体数据和成员函数,具有复制而来的数据成员和成员函数(基类私有成员可被继承,但无法访问),其中构造函数、析构函数、友元函数、静态数据成员、静态成员函数都不能被继承。基类中成员的访问方式只能由派生类决定是否访问它。增强了代码耦合性,但父类中的成员变量或者类本身被 final 关键字修饰时,修饰的类不能被继承,修饰的成员变量不能被重写

    • 意义:基类的程序代码可以被派生类调用,提高了软件复用的效率,缩短了软件开发的周期
  • 多态: 不同继承类的对象对同一信息做出不同的响应,基类的指针指向或者绑定到派生类对象,使得基类指针呈现不同的表现形式,在程序中体现了灵活多样的操作,提高了使用效率,简化了代码的编写和修改过程

三、C++的多态怎么实现?

C++的多态: 在基类的函数前加上 virtual 关键字,在派生类种重写该函数,运行时将会根据所指对象的实际类型来调用相应的函数,如果对象指针派生类,就调用派生类的函数,如果是基类的话,就调用基类的函数

虚表和虚表指针:

  • 虚表:虚函数表的缩写,类中含有 virtual 关键字修饰的方法时,编译器会自动生成虚表
  • 虚表指针:在含有虚函数的类实例化对象时,对象地址的前4个字节存储的指向虚表的指针 vfptr

多态的实现过程:

  • 编译器在发现基类中由虚函数时,会自动为每个含有虚函数的类生成一份虚表,该表是一个RTTI构成的指针数组,虚表里面保存了虚函数的入口地址
  • 编译器会在每个对象的前4个字节中保存一个虚表指针,即 vfptr,指向指向对象所属类的虚表。在构造时,根据对象的类型区初始化虚函数指针 vfptr,从而让它指向正确的虚表,在调用虚函数时,能够找到正确的虚函数进行调用
  • 所谓的合适时机,在派生类定义对象时,程序自动调用构造函数,在构造函数中创建虚表并对虚表进行初始化,在构造子类对象时,会先调用父类的构造函数,此时,编译器只看到了父类,并为父类初始化了虚表指针,指向父类的虚表,当调用子类的构造函数时,为子类对象初始化虚表指针,指向子类的虚表
  • 当派生类对基类的虚函数没有进行重写,派生类的虚表指针指向的是基类的虚表,当派生类对基类的虚函数进行重写时派生类的虚表指针指向的是自身的虚表,当派生类中有自己的虚函数时,在自己的虚表中将此虚函数地址添加在后面
  • 这样指向派生类的基类指针运行时,就可以根据派生类对虚函数重写情况动态的进行调用,从而实现多态性。

四、C++中类成员的访问权限和继承权限问题

三种访问权限

  • public:用该关键字修饰的成员表示公有成员,该成员不仅可以在类内可以被访问,在类外也是可以被访问的,是类对外提供的可访问接口;

  • private:用该关键字修饰的成员表示私有成员,该成员仅在类内可以被访问,在类体外是隐藏状态;

  • protected:用该关键字修饰的成员表示保护成员,保护成员在类体外同样是隐藏状态,但是对于该类的派生类来说,相当于公有成员,在派生类中可以被访问。

三种继承方式

  • 若继承方式是public,基类成员在派生类中的访问权限保持不变,也就是说,基类中的成员访问权限,在派生类中仍然保持原来的访问权限;

  • 若继承方式是private,基类所有成员在派生类中的访问权限都会变为私有(private)权限;

  • 若继承方式是protected,基类的共有成员和保护成员在派生类中的访问权限都会变为保护(protected)权限,私有成员在派生类中的访问权限仍然是私有(private)权限。

五、C++中的重载、重写(覆盖)和隐藏的区别

(1)重载(overload)

  • 重载是指在同一范围定义中的同名成员函数才存在重载关系。主要特点是函数名相同,参数类型和数目有所不同,不能出现参数个数和类型均相同,仅仅依靠返回值不同来区分的函数。重载和函数成员是否是虚函数无关。

(2)重写(覆盖)(override)

  • 重写指的是在派生类中覆盖基类中的同名函数,也就是重写函数体,其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),派生类对象调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰。

    • 重载与重写的区别:

      • 重写是父类和子类之间的垂直关系,重载是不同函数之间的水平关系

      • 重写要求参数列表相同,重载则要求参数列表不同,返回值不要求

      • 重写关系中,调用方法根据对象类型决定,重载根据调用时实参表与形参表的对应关系来选择函数体

(3)隐藏(hide)

  • 隐藏指的是某些情况下,派生类中的函数屏蔽了基类中的同名函数,包括以下情况:
    • 两个函数参数相同,但是基类函数不是虚函数。和重写的区别在于基类函数是否是虚函数。
    • 两个函数参数不同,无论基类函数是不是虚函数,都会被隐藏。和重载的区别在于两个函数不在同一个类中。

六、知道C++中的组合吗?它与继承相比有什么优缺点吗?

一、继承

继承是 Is 的关系,比如说Student继承Person,则说明Student is a Person。继承的优点是子类可以重写父类的方法来方便地实现对父类的扩展。

  • 继承的缺点有以下几点:

    • 父类的内部细节对子类是可见的

    • 子类从父类继承的方法在编译时就确定下来了,所以无法在运行期间改变从父类继承的方法的行为

    • 如果对父类的方法做了修改的话(比如增加了一个参数),则子类的方法必须做出相应的修改。所以说子类与父类是一种高耦合,违背了面向对象思想

二、组合

组合也就是设计类的时候把要组合的类的对象加入到该类中作为自己的成员变量。

  • 组合的优点:

    • 当前对象只能通过所包含的那个对象去调用其方法,所以所包含的对象的内部细节对当前对象时不可见的。

    • 当前对象与包含的对象是一个低耦合关系,如果修改包含对象的类中代码不需要修改当前对象类的代码。

    • 当前对象可以在运行时动态的绑定所包含的对象。可以通过set方法给所包含对象赋值。

  • 组合的缺点:

    • 容易产生过多的对象。

    • 为了能组合多个对象,必须仔细对接口进行定义。

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

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

相关文章

腾讯云拼了99元服务器老用户能买,续费不涨价!

良心腾讯云推出99元一年服务器,新用户和老用户均可以购买,续费不涨价,续费也是99元,配置为轻量2核2G4M、50GB SSD盘、300GB月流量、4M带宽:优惠价格99元一年,续费99元,官方活动页面 txybk.com/g…

C++类和对象(中篇)

目录 1. 类的6个默认成员函数 2. 构造函数 3.析构函数 4.拷贝构造函数 5.赋值运算符重载 6.const成员 7.取地址及const取地址操作符重载 1. 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是&#…

OpenMP

介绍 OpenMP 是一个应用程序接口 (API),由一组主要的计算机硬件和软件供应商共同定义。OpenMP 为共享内存并行应用程序的开发人员提供了一个可移植、可扩展的模型。该 API 支持各种架构上的 C/C 和 Fortran。 OpenMP是: 一个可…

基于动态内存设计的通讯录

test.c #define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h"void menu(){printf("\n");printf("1.增加联系人\n");printf("2.删除联系人\n");printf("3.查找联系人\n");printf("4.修改联系人\n");printf(&qu…

python学习笔记------字典

字典的定义 字典的定义,同样是使用{},不过存储的元素是一个个的键值对 基本语法: #定义字典字面量 {key:value,key:value,key:value,......key:value} #定义字典变量 my_dict{key:value,key:value,key:value,......key:value} #定义空…

elasticsearch篇:RestClient操作

1. RestClient ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址:Elasticsearch Clients | Elastic 其中的Java Rest Client又包括两种: Java Low Level Res…

Leetcode 3076. Shortest Uncommon Substring in an Array

Leetcode 3076. Shortest Uncommon Substring in an Array 1. 解题思路2. 代码实现 题目链接:3076. Shortest Uncommon Substring in an Array 1. 解题思路 这一题我的思路上很暴力,就是直接把所有可能的substring全部统计出来放到一起。 然后&#…

windows10+cpu+pycharm跑yolov5

1、安装anaconda和pycharm,安装方法参考: anaconda和pycharm安装(windows10 )-CSDN博客 2、创建yolov5环境,打开Anaconda Prompt命令打开cmd命令行窗口,如下所示: 输入:conda crea…

android pdf框架-6,文本生成pdf

前文介绍如何使用图片生成pdf,这里介绍如何使用文本生成pdf 使用mupdf生成 mupdf生成的pdf略大,字体可以自定义. 生成的代码不复杂,也有好几种,以story的方式生成为例 fun createPdfFromText(sourcePath: String, destPath: String): Boolean {val text EncodingDetect.rea…

【大模型】Hugging Face下载大模型的相关文件说明

Hugging Face下载大模型文件说明 1.前言 ​ 上图是毛毛张在HuggingFace的官网上的ChatGLM-6B大模型的所有文件,对于初学者来说,对于上面的文件是干什么的很多小伙伴是很迷糊的,根本不知道是干什么的,毛毛张接下来将简单讲述一下上面的每个文件的作用。 2.文件说明 在Hug…

FL Studio21最新官方完整免费版水果音乐制作软件下载

作为音乐制作软件专家,对于FL Studio21这款功能强大的音乐制作软件有着深入的了解,它为用户提供了从创作到后期制作的完整工作流程。以下是对其各项功能的全面、准确且详细的介绍: FL Studio 21 Win-安装包下载如下: https://wm.makeding.c…

vue项目部署服务器,因为跨域设置nginx.config要修改的配置

下面是我在vue项目中vite.config.js设置的配置代理 对于部署项目需要使用nginx进行vue项目的话,需要对nginx的配置文件进行如下修改即可

linux操作系统虚拟机的环境配置

目录 一、虚拟机安装(类似硬件的安装) (1)创建虚拟机 (2)创建虚拟机 二、IP和主机名称配置 1、设置VM上的IP 2、设置我们电脑上VMnet8的IP 3、设置虚拟机上的IP 主机名称映射 以下是设置主机名映射…

linux系统adb调试工具

adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb可以在Eclipse中通过DDMS来调试Android程序,说白了就是调试工具。 adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会…

实时工业控制系统的创新整合:PLC4X与CnosDB的高效数据采集与存储

在当代工业自动化系统中,实时监测和数据分析变得至关重要。本文将介绍如何通过集成Apache PLC4X与CnosDB,实现对工业控制系统中的PLC设备进行高效数据采集和存储,为工程师们提供更强大的数据分析和监测工具。 PLC的定义 PLC是可编程逻辑控制…

哈希表|242.有效的字母异位词

力扣题目链接 bool isAnagram(char* s, char* t) {int len_s strlen(s), len_t strlen(t);if(len_s ! len_t) {return false;}int table[26];memset(table, 0, sizeof(table));for(int i 0; i < len_s; i) {table[s[i] - a];}for(int i 0; i < len_t; i) {table[t[i…

Unity中使用代码动态修改URP管线下的标准材质是否透明

//修改为透明 material.SetFloat("_Surface",1.0f); material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); material.Set…

Unity 关节:铰链、弹簧、固定、物理材质:摩檫力、 特效:拖尾、

组件-物理-关节&#xff1a;铰链&#xff08;类似门轴&#xff09; 自动动作、多少力可以将其断开、 弹簧可以连接另一个刚体&#xff08;拖动即可&#xff09; 固定一般是等待一个断裂力&#xff0c;造成四分五裂的效果。 物理材质 设置摩檫力&#xff0c;则可以创造冰面的…

复制表

目录 复制表 将部门 30 的所有员工信息保存在 emp30 表中 将复杂查询结果创建为表 只将 emp 表的结构复制为 empnull 表 从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 复制表 严格来说&#xff0c;复制表不是复制操作&am…

【NR 定位】3GPP NR Positioning 5G定位标准解读(七)- GNSS定位方法

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…