【面试八股总结】面向对象三大特性、虚函数、纯虚函数、虚继承

news2024/9/24 15:23:36

参考资料:阿秀

一、面向对象三大特性

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

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

多态:同一种事务表现出不同事务的能力,即:向不同对象发送同一消息,不同的对象在接收时会产生不同的行为

        重载实现编译时多态,虚函数实现运行时多态。

实现多态的两种方式:

  • 覆盖:子类重新定义父类的虚函数做法
  • 重载:允许存在多个同名函数,而这些函数的参数表不同(参数个数不同、或者参类型不同、或者两者都不同)

二、虚函数

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

底层原理:

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

上图展示了虚表和虚表指针在基类对象和派生类对象中的模型,那么多态具体是如何实现的呢?

1. 对象初始化

  • 编译器会自动为每个含有虚函数的类生成一份虚表,该表时一个一维指针数组,虚表中保存了虚函数的入口地址。
  • 编译器会在每个对象的前四个字节中保存一个虚表指针vptr,指向对象所属类的虚表。在构造时,根据对象的类型初始化虚指针vptr,从而让虚指针指向正确的虚表。
  • 在派生类定义对象时,程序会自动调用构造函数,在构造函数中创建虚表并对虚表初始化。

2. 虚指针指向

  • 当派生类对基类的虚函数没有重写时,派生类的虚表指针指向的是基类的虚表;
  • 当派生类对基类的虚函数重写时,派生类的虚表指针指向的是自身的虚表;
  • 当派生类中有自己的虚函数时,在自己的虚表指针中将此虚函数地址添加在后面。

这样指向派生类的基类指针在运行时,可以根据派生类对虚函数重写情况动态进行调用,从而实现多态性。

构造函数和析构函数可以声明为虚函数吗?

        构造函数不能定义为虚函数,析构函数可以为虚函数,并且一般情况下基类析构函数都要定义为虚函数。

        构造函数:每个含有虚函数的类都有一个虚表指针,指向虚函数表。如果构造函数时虚函数,就需要通过虚表指针寻找虚函数表,从而找到对应的虚函数实现。但是类对象还没有初始化,就没有虚表指针,找不到虚函数,所以构造函数不能时虚函数。

        析构函数:只有在基类析构函数是虚函数时,调用delete操作符销毁指向派生类的基类指针时,才能准确调用派生类的析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。

三、纯虚函数

虚函数和纯虚函数的区别?

  • 虚函数是为了实现动态编译产⽣的,目的是通过基类类型的指针指向不同对象时,自动调用相应的、和基类同名的函数(使⽤同⼀种调用形式,既能调用派生类又能调用基类的同名函数)。虚函数需要在基类中加上 virtual修饰符修饰,因为virtual会被隐式继承,所以子类中相同函数都是虚函数。当⼀个成员函数被声明为虚函数之后,其派生类中同名函数自动成为虚函数,在派生类中重新定义此函数时要求函数名、返回值类型、参数个数和类型全部与基类函数相同。
  • 纯虚函数只是相当于⼀个接口名,但含有纯虚函数的类不能够实例化

纯虚函数首先是虚函数,其次没有函数体,取而代之使用“=0”代替。

它的函数指针会被存在虚函数表中,由于纯虚函数并没有具体的函数体,因此他在虚函数表中的值为0,其他有函数体的虚函数则是函数的具体地址。

一个类中如果存在纯虚函数,称为抽象类,抽象类不能用于实例化,一般用于定义一些公有方法。子类继承抽象类也必须实现其中的纯虚函数才能实例化对象。

四、虚拟继承

一个类可以从多个基类(父类)继承属性和行为。在C++等支持多重继承的语言中,一个派生类可以同时拥有多个基类。

多重继承可能引入一些问题,如萎形继承问题,比如当一个类同时继承了两个拥有相同基类的类,而最终的派生类又同时继承了这两个类时,可能导致二义性和代码设计上的复杂性。为了解决这些问题,C++ 提供了虚继承,通过在继承声明中使用 virtual 关键字,可以避免在派生类中生成多个基类的实例,从而解决了菱形继承带来的二义性。

举个🌰:

#include <iostream>
 using namespace std;
 
 class A{}
 class B : virtual public A{};
 class C : virtual public A{};
 class D : public B, public C{};
 
int main()
 {
   cout << "sizeof(A):" << sizeof A <<endl; // 1,空对象,只有⼀个占位
   cout << "sizeof(B):" << sizeof B <<endl; // 4,⼀个bptr指针,省去占位,不需要对⻬
   cout << "sizeof(C):" << sizeof C <<endl; // 4,⼀个bptr指针,省去占位,不需要对⻬
   cout << "sizeof(D):" << sizeof D <<endl; // 8,两个bptr,省去占位,不需要对⻬
 }

上述代码所体现的关系是,B和C虚拟继承A,D公有继承B和C,这种方式是⼀种菱形继承或者钻石继承,可以用下图来表示:

        虚拟继承的情况下,无论基类被继承多少次,只会存在一个实体。

        虚拟继承基类的子类中,子类会增加某种形式的指针,或者指向虚基类子对象,或者指向一个相关表格;表格中存放的不是虚基类子对象的地址,就是其偏移量,此类指针被称为bptr。如果即存在vptr又存在bptr,某些编译器会将其优化,合并为一个指针。

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

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

相关文章

井字游戏00

题目链接 井字游戏 题目描述 注意点 1 < board.length board[i].length < 100输入一定遵循井字棋规则 解答思路 如果某一方想要获胜&#xff0c;则其需要占满某一行或某一列或对角线&#xff0c;所以只需要根据第一行和第一列判断是否填充完某一行或某一列或对角线…

开源项目预告Demo演示:应用极其简单的多级GUI库

之前在做项目的时候&#xff0c;需要用到多级GUI&#xff0c;当时使用的是用数组穷举列出来各个界面的方式&#xff08;也有人管它叫索引法&#xff09;&#xff0c;缺点也是很多的&#xff0c;比如开发繁琐&#xff0c;维护不便&#xff0c;难以添加过渡动画&#xff0c;各个界…

【基于R语言群体遗传学】-14-种群起源的相对似然

我们可以将预测的基因型比例视为在种群中看到一组特定等位基因的概率。如果种群在等位基因频率上存在差异&#xff0c;我们可以使用基因型来推断个体起源于每个种群的相对可能性。大家可以先看一下之前的博客&#xff1a;群体遗传学_tRNA做科研的博客-CSDN博客 种群起源的相对似…

同星智能正式推出CAN总线一致性测试系统

CAN总线一致性测试系统 CAN FD/CAN总线一致性测试系统&#xff0c;在硬件系统上基于同星自主研发的总线分析工具&#xff0c;干扰仪&#xff0c;一致性测试机箱&#xff0c;并搭配程控电源&#xff0c;示波器&#xff0c;数字万用表等标准外围仪器设备&#xff1b;在软件上基于…

Python轻松实现人脸检测,打造专业级AI颜值鉴定工具

Python实现人脸检测 1. 简介1.1 人脸检测的背景和意义1.2 使用Python进行人脸检测的优势1.2.1 多种成熟的库和工具1.2.2 开发者社区的支持1.2.3 简便易用的语法和库 2. 准备工作2.1 Python环境的安装2.1.1 下载Anaconda2.1.2 安装Anaconda2.1.3 使用Anaconda 2.2 第三方库的安装…

数据结构——Trie

题目&#xff1a; 维护一个字符串集合&#xff0c;支持两种操作&#xff1a; I x 向集合中插入一个字符串 x&#x1d465;&#xff1b;Q x 询问一个字符串在集合中出现了多少次。 共有 N&#x1d441; 个操作&#xff0c;所有输入的字符串总长度不超过 10^5&#xff0c;字符串仅…

使用Python绘制箱线图并分析数据

使用Python绘制箱线图并分析数据 在这篇博客中&#xff0c;我们将探讨如何使用Python中的pandas库和matplotlib库来绘制箱线图&#xff0c;并分析数据文件中的内容。箱线图是一种常用的图表类型&#xff0c;用于展示数据的分布情况及其统计特性&#xff0c;如中位数、四分位数…

【Linux】vim详解

1.什么是vi/vim? 简单来说&#xff0c;vi是老式的文本编辑器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。vim则可以说是程序开发者的一项很好用的工具&#xff0c;就连 vim的官方网站&#xff08; http://www.vim.org&#xff09;自己也说vim是一…

【Perforce】QAC-分析时如何不应用某些规则

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决扫描项目时如何不应用某些规则进行分析。 2、 问题场景 对于一些建议性的MISRA规则&#xff0c;不想用于项目扫描&#xff0c;如何处理&#xff1f; 3、软硬件环境 1、软件版本&#xff1a;HelixQAC23.04 2…

STM32CubeIDE离线汉化教程

按照网上的方法下载好ZIP文件后 帮助->安装新软件-> 按顺序选择文件 点击完成&#xff0c;后等待右下脚的精度条到位即可

总结之企业微信(一)——创建外部群二维码,用户扫码入群

创建外部群 企微接口中没有直接通过服务端API接口创建外部群 可以通过jssdk创建外部群&#xff1a;引用jssdk调用会话接口wx.openEnterpriseChat https://work.weixin.qq.com/api/doc/90000/90136/90511 创建外部群二维码 需要通过企业微信的应用&#xff0c;并且配置客户联…

绝区陆--大语言模型的幻觉问题是如何推动科学创新

介绍 大型语言模型 (LLM)&#xff08;例如 GPT-4、LLaMA-2、PaLM-2、Claude-2 等&#xff09;已展示出为各种应用生成类似人类文本的出色能力。然而&#xff0c;LLM 的一个鲜为人知的方面是它们倾向于“产生幻觉”或生成不正确或没有根据的事实陈述。我不认为这仅仅是一个限制…

下载安装Microsoft DirectX SDK(June 2010)

官方下载网址如下&#xff1a; Microsoft DirectX SDK(June 2010)链接 下载后是一个.exe文件 在安装之前&#xff0c;需要先检查你的电脑中是否已经安装过&#xff08;如果你安装过VS&#xff0c;那么一定会有这两个文件&#xff09; Microsoft Visual C 2010 x86 Redistribu…

解决 NullReferenceException: Object reference not set to an instance of an object

在 Unity 中 利用 URDF Importer import UR5e_gripper 的 URDF file 时出现错误&#xff1a; NullReferenceException: Object reference not set to an instance of an object。 理论上是有个Object 是 Null&#xff0c;当我再次检查URDF后仍觉得路径没有写错。 于是我 把Mesh…

压缩感知2——算法模型

采集原理 其中Y就是压缩后的信号表示(M维)&#xff0c;Φ表示采集的测量矩阵&#xff0c;可以是一个随机矩阵&#xff0c;X代表原始的数字信号&#xff08;N维&#xff09;。 常见的测量矩阵——随机高斯矩阵 随机伯努利矩阵 稀疏随机矩阵等&#xff0c;矩阵需要满足与信号的稀…

SenseVoice - 阿里最新开源精准多语言语音识别与情感辨识模型 本地一键整合包下载

阿里巴巴近期发布了开源语音大模型项目FunAudioLLM&#xff0c;该项目包含了两个核心模型&#xff1a;SenseVoice和CosyVoice。可以精准多语言识别并且进行语音克隆 本地一键包下载地址&#xff1a; SenseVoice - 精准多语言语音识别与情感辨识模型 本地一键整合包下载 SenseVo…

Appium-移动端自动测试框架详解

Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门&#xff0c;那么我们就直奔主题。文章结构如下&#xff1a; 为什么要使用Appium&#xff1f;如何搭建Appium工具环境?(超详细&#xff09;通过demo演示Appium的使用Appium如何实现移动端UI自…

基层医院、专科医院云HIS系统,支持电子病历四级,全套源码交付

云HIS系统采用B/S架构云端SaaS服务的方式提供&#xff0c;使用用户通过浏览器即能访问&#xff0c;无需关注系统的部署、维护、升级等问题&#xff0c;系统充分考虑了模板化、配置化、智能化、扩展化等设计方法&#xff0c;覆盖了基层医院的主要工作流程&#xff0c;能够与监管…

大模型常见的LoRA算法原理、实现和运用详解

文章目录 1. 前言2. 算法介绍2.1 微调2.2 核心思想 3. 几个关键问题3.1 LoRA如何应用在Transformer上3.2 LoRA的最佳秩r如何选择3.3 W W W和 Δ W \Delta W ΔW有什么关系 4. 源码5. 实际应用6. 总结7. 参考 1. 前言 本文是常用算法的快速浏览入门&#xff08;扫盲&#xff0…

升级iOS18有问题?学会这2招能解决90%iOS问题!

在 iOS 18beta发布后&#xff0c;有部分朋友升级后表示遇到了各种奇怪问题&#xff0c;比如升级卡在Apple Logo&#xff0c;黑屏&#xff0c;无限重启&#xff0c;卡在恢复模式&#xff0c;程序闪退&#xff0c;电池消耗过快&#xff0c;发烫等问题。 于是&#xff0c;小编决定…