当前位置: 首页 > news >正文

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

✍个人博客:Pandaconda-CSDN博客

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

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

16. 什么是虚拟继承?

由于 C++ 支持多继承,除了 public、protected 和 private 三种继承方式外,还支持虚拟(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,某些编译器会将其优化,合并为一个指针。

没有虚继承:

// 间接基类A
class A{
protected:int m_a;
};
// 直接基类B
class B: public A{
protected:int m_b;
};
// 直接基类C
class C: public A{
protected:int m_c;
};
// 派生类D
class D: public B, public C{
public:void seta(int a){//m_a = a;     //命名冲突A::m_a = a;    //命名不再冲突}void setb(int b){m_b = b; //正确}void setc(int c){m_c = c; //正确} void setd(int d){m_d = d; //正确} 
private:int m_d;
};
int main(){D d;return 0;
}

有虚继承:

// 间接基类A
class A{
protected:int m_a;
};
// 直接基类B
class B: virtual public A{
protected:int m_b;
};
// 直接基类C
class C: virtual public A{
protected:int m_c;
};
//派生类D
class D: public B, public C{
public:void seta(int a){m_a = a; //正确}void setb(int b){m_b = b; //正确}void setc(int c){m_c = c; //正确} void setd(int d){m_d = d; //正确} 
private:int m_d;
};

17. 哪些函数不能是虚函数?把你知道的都说一说

  1. 构造函数,构造函数初始化对象,派生类必须知道基类函数干了什么,才能进行构造;当有虚函数时,每一个类有一个虚表,每一个对象有一个虚表指针,虚表指针在构造函数中初始化。

  2. 内联函数,内联函数表示在编译阶段进行函数体的替换操作,而虚函数意味着在运行期间进行类型确定,所以内联函数不能是虚函数。

  3. 静态函数,静态函数不属于对象属于类,静态成员函数没有 this 指针,因此静态函数设置为虚函数没有任何意义。

  4. 友元函数,友元函数不属于类的成员函数,不能被继承。对于没有继承特性的函数没有虚函数的说法。

  5. 普通函数,普通函数不属于类的成员函数,不具有继承特性,因此普通函数没有虚函数。

  6. 模板函数,每个含有虚函数的类中都有一个虚函数表,该虚函数表存储着该类的所有的虚函数的地址。然而,当虚函数为模板函数时,由于编译阶段无法确定类的虚函数表的大小,因此编译器禁止这种用法。这是因为编译器在编译一个文件时并不知道其他文件对该类的虚函数的调用情况,所以无法确定模板虚函数的实例化个数。

18. 什么是纯虚函数,与虚函数的区别

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

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

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

举个例子:

#include <iostream>
using namespace std;class Base
{
public:virtual void fun1(){cout << "普通虚函数" << endl;}virtual void fun2() = 0;virtual ~Base() {}
};class Son : public Base
{
public:virtual void fun2() {cout << "子类实现的纯虚函数" << endl;}
};int main()
{Base* b = new Son;b->fun1(); //普通虚函数b->fun2(); //子类实现的纯虚函数return 0;
}

虚函数和纯虚函数区别?

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

  • 纯虚函数只是相当于一个接口名,但含有纯虚函数的类不能够实例化。

相关文章:

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

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…...

基于tcp c/s的网络通信

TCP&#xff08;即传输控制协议&#xff09;&#xff1a;是一种面向连接的传输层协议&#xff0c;它能提供高可靠性通信(即数 据无误、数据无丢失、数据无失序、数据无重复到达的通信) tcp协议特点: 1. 面向连接 //类似打电话通话之前 &#xff0c;必须先打通 2. 可靠传输 …...

论文翻译:Universal and Transferable Adversarial Attacks on Aligned Language Models

Universal and Transferable Adversarial Attacks on Aligned Language Models https://arxiv.org/pdf/2307.15043v2 通用且可转移的对抗性攻击对齐语言模型 文章目录 通用且可转移的对抗性攻击对齐语言模型摘要1 引言2 一个针对LLMs的通用攻击2.1 产生肯定回应2.2 贪婪坐标梯…...

Axure RP 9高手速成秘籍:解锁终极快捷键,设计效率飙升10倍!

Axure RP 9作为一款功能强大的原型设计工具&#xff0c;提供了丰富的快捷键来加速设计流程。以下是一份详尽的Axure RP 9快捷键大全&#xff0c;旨在帮助用户更高效地完成设计工作。 一、文件操作 新建&#xff1a;Ctrl N&#xff08;Windows&#xff09;/ Command N&#…...

Springcloud从零开始--Eureka(一)

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有…...

[数据集][目标检测]agvs仓储机器人检测数据集VOC+YOLO格式967张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;967 标注数量(xml文件个数)&#xff1a;967 标注数量(txt文件个数)&#xff1a;967 标注类别…...

(八)Flink Join 连接

在分布式数据处理中,JOIN 是一个非常重要的操作。Flink 的 JOIN 是用于将两个数据流按照一定的条件进行连接,生成新的数据流。Flink 双流 JOIN 主要分为两大类:一类是基于窗口的 JOIN 操作,另一类是基于原生 State 的 Connect 算子操作。其中基于窗口的 JOIN 可细分为 Wind…...

你也想转行成为一名程序员吗?作为过来人的我希望你想清楚这几个问题再做决定

1 有个朋友突然找我&#xff1a;“现在的工作不想干了&#xff0c;我现在转行搞IT能不能行&#xff1f;学哪个编程语言比较有前景&#xff1f;现在去搞网络安全应该没问题吧&#xff1f;”我相信&#xff0c;很多人出于各种原因都在考虑要不要进行职业转换&#xff0c;迷茫又焦…...

Linux文件属性和打包压缩详解

1、文件属性体系 1.1 文件系统概述 [rootyunwei /]# ls -lhi 总用量 72K3505 lrwxrwxrwx. 1 root root 7 3月 7 2019 bin -> usr/bin 262152 dr-xr-xr-x. 5 root root 4.0K 12月 19 16:00 boot 399635 drwxr-xr-x 2 root root 4.0K 11月 5 2019 data1026 drw…...

微服务注册到nacos时,注册失败报错解决

微服务注册到nacos时&#xff0c;注册失败报错解决 微服务注册nacos时报错nacos报错alipay-jraft.log日志报错原因排查 微服务注册nacos时报错 NacosException: failed to req API:/nacos/v1/ns/instance/list after all servers([127.0.0.1:28100]) tried: ErrCode:503, ErrM…...

基于Sringboot+Vue个人驾校预约管理系统--论文pf

TOC springboot503基于SringbootVue个人驾校预约管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。…...

python-逆序数(赛氪OJ)

[题目描述] 在一个排列中&#xff0c;如果一对数的前后位置与大小顺序相反&#xff0c;即前面的数大于后面的数&#xff0c;那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。比如一个元素个数为 4 的数列&#xff0c;其元素为 2,4,3,1&#xff0c;则 (2,…...

PCIE-flit mode retry

下一个即将发送的seq num: 下一个即将发送的ack或者nak的seq num: Tx发送exp seq num的个数: Tx发送nak的个数 下一个期望收到的flit的seq num&#xff0c;注意是指下个期望收到的有效的、non-idle、non_duplictae的flit: 收到的flit的真实的seq num&#xff08;implicit…...

使用Obsidian实现Anki快速制卡

文章目录 前言准备双双启用遇到问题查看是什么问题解决问题 开始使用使用前的一些设置快速制卡 前言 我现在使用 Anki 的同时也使用 Obsidian&#xff0c;正好可以通过插件来让这两个十分好用的软件实现联动。 在 Obsidian 中实现 Anki 的快速制卡。 准备 首先要在这两个软…...

Python编程:从入门到实践书籍介绍

对于Python入门的书籍推荐&#xff0c;以下是五本详细讲解的书籍&#xff0c;它们各自具有不同的特点和适用对象&#xff1a; 1. 《Python编程:从入门到实践》 作者&#xff1a;埃里克马瑟斯&#xff08;Eric Matthes&#xff09;《Python编程:从入门到实践》是一本经典的Pyth…...

Vue 3 的 emit 简单使用

在 Vue 3 中使用 emit&#xff0c;子组件可以将事件通知父组件&#xff0c;父组件可以在响应这些事件时执行特定的逻辑。 emit 是一种非常灵活的通信方式&#xff0c;允许组件之间以解耦的方式进行交互。 1. 基本用法 1、使用 defineEmits 子组件 <template><div…...

java在实际开发中反常识bug

目录 1.背景 2.案例 1.包装类型拆箱导致空指针异常 2.switch传入null,导致空指针异常 3.Arrays.asList添加异常 4.转BigDecimal类型时精度丢失 5.除以0不一定抛异常 6.Steam filter后集合修改,会修改原数据 3.完美&评论 1.背景 这篇博客,将列举本人在实际开发中看…...

java多线程(三)重排序与Happens-Before

一、重排序 1.1 指令重排定义和含义 定义&#xff1a;重排序是指编译器和处理器为了提高程序执行效率&#xff0c;在不改变单线程程序执行结果的前提下&#xff0c;对指令执行顺序进行重新排列的一种优化手段。 重排序可以发生在编译器优化阶段&#xff0c;也可以发生在处理…...

RUST知识框架与学习框架

RUST知识框架与学习框架 Rust是一门系统级编程语言&#xff0c;以其内存安全、高性能和并发性而著称&#xff0c;特别适用于开发低级系统、网络服务和并发应用&#xff0c;具有广泛应用前景。 一、Rust知识框架 基础语法与核心概念 变量与类型&#xff1a;包括基本数据类型、…...

git cherry-pick命令使用分享

在日常开发中&#xff0c;有时候会遇到一种情况&#xff0c;线上出了问题&#xff0c;但是现在的预生产环境&#xff08;Pre-production Environment&#xff09;或准生产环境&#xff08;Stage Environment&#xff09;有还未通过验收的内容&#xff0c;那么想进行修复可以选择…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

FOPLP vs CoWoS

以下是 FOPLP&#xff08;Fan-out panel-level packaging 扇出型面板级封装&#xff09;与 CoWoS&#xff08;Chip on Wafer on Substrate&#xff09;两种先进封装技术的详细对比分析&#xff0c;涵盖技术原理、性能、成本、应用场景及市场趋势等维度&#xff1a; 一、技术原…...

VSCode 没有添加Windows右键菜单

关键字&#xff1a;VSCode&#xff1b;Windows右键菜单&#xff1b;注册表。 文章目录 前言一、工程环境二、配置流程1.右键文件打开2.右键文件夹打开3.右键空白处打开文件夹 三、测试总结 前言 安装 VSCode 时没有注意&#xff0c;实际使用的时候发现 VSCode 在 Windows 菜单栏…...