嵌入式面经大全(10/30)--继承、多态常见面试题(一)

牛客高级系列专栏:





简介

本人2020年本硕毕业于广东工业大学:嵌入式许乔丹,牛客高级专栏作者,牛客大学讲师,本科阶段搞了4年单片机、曾参加全国大学生恩智浦汽车竞赛,发表4个硬件专利。研究生阶段找了嵌入式linux的实习,毕业后拿到珠海格力,云从科技,CVTE,小米,美的,华为的嵌入式offer,签约CVTE嵌入式岗位。

在CVTE先后做过嵌入式Linux开发和安卓系统开发,参与过TV板卡、显示屏板卡、智能家居板卡、希沃网课学习机的开发。欢迎交流嵌入式或者安卓哈!

正文开始⬇️

第二章 C/C++高频面试题 (本文讲2.2.1-2.2.4)

2.1 c和c++区别、概念相关面试题

2.1.1 new和malloc的区别⭐⭐⭐⭐⭐

2.1.2 malloc的底层实现⭐⭐⭐⭐

2.1.3在1G内存的计算机中能否malloc(1.2G)?为什么?⭐⭐

2.1.4指针与引用的相同和区别;如何相互转换?⭐⭐⭐⭐⭐

2.1.5 C语言检索内存情况 内存分配的方式⭐⭐⭐

2.1.6  extern”C” 的作用⭐⭐⭐

2.1.7 extern容易忽略的知识点⭐⭐⭐⭐

2.1.8函数参数压栈顺序,即关于__stdcall和__cdecl调用方式的理解⭐⭐⭐

2.1.9重写memcpy()函数需要注意哪些问题⭐⭐

2.1.10数组到底存放在哪里⭐⭐⭐

2.1.11  struct和class的区别 ⭐⭐⭐⭐⭐

2.1.12 char和int之间的转换;⭐⭐⭐

2.1.13  static的用法(定义和用途)⭐⭐⭐⭐⭐

2.1.14  cosnt的用法(定义和用途)⭐⭐⭐⭐⭐

2.1.15const常量和#define的区别(编译阶段、安全性、内存占用等) ⭐⭐⭐⭐

2.1.16  volatile作用和用法 ⭐⭐⭐⭐⭐

2.1.17有常量指针 指针常量 常量引用 没有 引用常量⭐⭐⭐

2.1.18没有指向引用的指针,因为引用是没有地址的,但是有指针的引用⭐⭐⭐

2.1.19c/c++中变量的作用域⭐⭐⭐⭐⭐

2.1.20 c++中类型转换机制?各适用什么环境?dynamic_cast转换失败时,会出现什么情况?⭐⭐⭐⭐

2.2 继承、多态相关面试题 ⭐⭐⭐⭐⭐

2.2.1继承和虚继承 ⭐⭐⭐⭐⭐

2.2.2多态的类,内存布局是怎么样的 ⭐⭐⭐⭐⭐

2.2.3被隐藏的基类函数如何调用或者子类调用父类的同名函数和父类成员变量 ⭐⭐⭐⭐⭐

2.2.4多态实现的三个条件、实现的原理 ⭐⭐⭐⭐⭐

2.2.5对拷贝构造函数 深浅拷贝 的理解 拷贝构造函数作用及用途?什么时候需要自定义拷贝构造函数?⭐⭐⭐

2.2.6析构函数可以抛出异常吗?为什么不能抛出异常?除了资源泄露,还有其他需考虑的因素吗?⭐⭐⭐

2.2.7什么情况下会调用拷贝构造函数(三种情况)⭐⭐⭐

2.2.8析构函数一般写成虚函数的原因⭐⭐⭐⭐⭐

2.2.9构造函数为什么一般不定义为虚函数⭐⭐⭐⭐⭐

2.2.10什么是纯虚函数⭐⭐⭐⭐⭐

2.2.11静态绑定和动态绑定的介绍⭐⭐⭐⭐

2.2.12 C++所有的构造函数 ⭐⭐⭐

2.2.13重写、重载、覆盖的区别⭐⭐⭐⭐⭐

2.2.14成员初始化列表的概念,为什么用成员初始化列表会快一些(性能优势)?⭐⭐⭐⭐

2.2.15如何避免编译器进行的隐式类型转换;(explicit)⭐⭐⭐⭐

2.2.1继承和虚继承

解析:因为C++支持多重继承,那么在这种情况下会出现重复的基类这种情况,也就是说可能出现将一个类两次作为基类的可能性。比如像下面的情况

为了节省内存空间,可以将DeriverdA、DeriverdB对Base的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如 下:

class Base

class DeriverdA:public virtual Base; //虚继承

class DeriverdB:public virtual Base; //虚继承

class D:public DeriverdA,DeriverdB;  //普通继承

虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推荐的,也并不常用,而一旦离开了多重继承,虚拟继承就完全失去了存在的必要因为这样只会降低效率和占用更多的空间。

:不要全部都使用虚继承,因为虚继承会破坏继承体系,不能按照平常的继承体系来进行类型转换(如C++提供的强制转换函数static_cast对继承体系中的类对象转换一般可行的,这里就不行了)。所以不要轻易使用虚继承,更不要在虚继承的基础上进行类型转换,切记切记!

2.2.2多态的类,内存布局是怎么样的

解析:关于类的内存布局主要是考某个类所占用的内存大小,以下通过几个案例加以分析。

(1)虚继承:如果是虚继承,那么就会为这个类创建一个虚表指针,占用4个字节

#include <stdio.h>  
class A {  
public:  
    int a;  
}; //sizeof(A)=4,因为a是整形,占用4字节

class B : virtual public A {  
public:  
    int b;  
};//sizeof(B)=4(A副本)+4(虚表指针占用4字节)+4(变量b占用4字节)=12  

class C : virtual public B {       
};//sizeof(c)= 12(B副本)+4(虚表指针) = 16,如果这里改为直接继承,那么sizeof(c)=12,因为此时就没有虚表指针了

(2)多重继承:如果是以实现多重继

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式/C++面试题解析大全 文章被收录于专栏

#承诺提供免费技术答疑# 该专栏是我校招阶段整理的关于“嵌入式面经”的111道题目,“C/C++软件开发岗位”也可以参考下。涵盖了大多数嵌入式/软件开发岗位常见基础面试题,题目来源是牛客网各大大厂的面经,答案是我逐个查阅资料,是嵌入式面试最常见的题目和答案。订阅即赠送简历模板、超大笔试面试真题大礼包、内推机会,需要的同学点击我头像私信即可!

全部评论
"此时指向基础类的指针pFather已经变成指向具体的类son的this指针,那么我们调用这个pFather父类指针,就相当于调用了等号右边的类即子类son的this指针,这个this所能调用的函数,自然就是子类son本身的函数。即pFather->Say();这行代码调用的是子类的Say()函数。因此我们就成功的实现了用父类指针pFather调用子类函数,也就是实现了多态。" 这部分我觉得不太准确。因为多态实现依靠虚函数表,可以用基类的指针是因为查找虚表的虚表指针在子类的父类部分,生成子类的对象的时候,有了新的虚表,并且对父类的虚方法进行了覆盖,这个指针实际上还是没法调用子类中的非虚函数方法。
1 回复 分享
发布于 2020-07-17 12:50
class A { public: virtual void aa() { } virtual void aa2() { } //如果此时类里有一个或多个虚函数,那么需要加1个虚指针空间 private: char ch[3]; }; // 1+4 =补齐= 8 class B: virtual public A //如果还是虚继承,那么需要再加1个虚指针空间,最多就2个虚指//针空间。 { public: virtual void bb() { } virtual void bb2() { } }; // 8(副本)+4(虚继承)+4(虚指针)= 16 这个例子中,因为B类中的虚函数没有完全覆盖A中的,所以新添了一个虚表指针,但是如果完全覆盖了,变成 class B: virtual public A //如果还是虚继承,那么需要再加1个虚指针空间,最多就2个虚指//针空间。 { public: virtual void aa() { } virtual void aa2() { } }; // 8(副本)+4(虚继承)= 12 我记得应该是这样
1 回复 分享
发布于 2020-07-17 12:42
关于多态有点问题。多态指的是一段程序能够处理多种类型对象的能力。那么实现多态的方式有重载多态(函数重载和运算符重载)、类型强制转换、类型参数化多态(函数模板、类模板)、包含多态(继承与虚函数)
2 回复 分享
发布于 2020-09-28 20:36
我的理解是: 1.如果两个类中只要一个类中有虚函数,那么类size就+4(不管几个类有虚函数,都只能加一次4). 2.如果继承只要不是全是virtual的,例如一个public和一个virtual。那么都不加4,反之加4 3.注意减去副本的时候需要两个父类都是虚继承了一个类
点赞 回复 分享
发布于 2023-05-23 09:40 英国
(4)虚继承(多重继承和虚函数) 最后一个计算不对,应该是16+16-4+12=40
点赞 回复 分享
发布于 2022-02-12 15:49
关于虚函数和虚继承的好帖子:https://blog.csdn.net/qq_41689072/article/details/81350984 详细地讲明了如何使用VS看内存空间以及占用内存大小,避免死记硬背
点赞 回复 分享
发布于 2020-10-07 20:28
是的 我也想过这问题,这个“多态”我理解为两种不同的概念,你上面说的很对。
点赞 回复 分享
发布于 2020-10-05 00:15
那么如果一个类又有继承来的虚函数,又有新增的虚函数,是不是应该还要新增内存?(这种情况应该不多见?)
点赞 回复 分享
发布于 2020-07-16 20:21
虚函数内存我有一个理解不知道对不对:当虚函数是继承来的(不管是虚继承还是什么继承),是不会新增加内存的,比如2.2.2(3)中class D的例子;如果虚函数是自己的新增的,就需要增加内存,比如2.2.2(5)的class B。是这样吗?
点赞 回复 分享
发布于 2020-07-16 20:19
结合案例,好评!大佬用心了
点赞 回复 分享
发布于 2020-06-04 21:18

相关推荐

从小父母离异家里没人管,靠着心里的不安和学校的环境也算是坚持到了学有所成的地步。到了大学环境开始松散不知道该做什么,只觉得在不挂科的基础上能往上考多少就考多少,等到秋招来临才发现自己有多么幼稚无能,今年九月份初才发现自己原来连一个求职的方向都没有。因为之前做过前后端一体的课设,算是有过了解,而对于其他岗位连做什么都不知道,因此这一个半个月在越来越焦虑的同时埋头苦学,事到如今想要活下去我似乎只能走前端这条路了,9月初先是靠着虚假夸大能力的简历得到一些笔试来确定了考察的方向,有一个大厂的无笔试面试最终是拒绝了没有勇气去面对。然后在这个基础上埋头苦学,如今也算是搭好了自己前端学习的框架和思考的瞄,可以逐渐给自己扩展新的知识和能力了,但这并不是一件多好的事儿,因为我发现学的越多越焦虑,学的越多便越无力。因为我感觉我如今努力学习的知识都是竞争对手们早就掌握了的东西,我如今困惑追求答案的难题早就被别人解决。别人早就能得心应手地做出项目而我连思考都会卡壳,看着别人的笔试和面经上那些闻所未闻的题目,我才知道别人到底有多强而我有多幼稚,我什么时候才能达到别人那种堪称熟练的能力呢?而且网上的焦虑越多越多,即便是真有这么高的能力最后也大概落得一个低薪打工人的下场,我真的感到迷茫。秋招都快结束了,而我还在继续痛苦的学习之旅,这些天找前端面试发现似乎问的有些简单跟网上搜到的内容不符(可能因为并不是大厂),我是不是本来就没打算被招所以别人懒得细问呢?我不知道,我只能继续总结下去学习下去,不管如何我都要活下去,如果我能早一些准备就好了,如果暑假能意识到现在这个情况就好了,可惜没有如果。种下一棵树的最好时间是十年前,其次是现在,虽然我相信自己的学习能力,但已经错过了最好的时机,只能在焦虑与痛苦中每天坚持学下去。目前的路还有很长很长,先去把typescript看了,再去巩固vue3的基础,再去练习elementui的使用,如果这能找到实习的话就好了。接下来呢?去学uniapp和小程序,不管如何我都要对得起曾经努力的自己。即便我们都感到痛苦,但我心中还是希望我们都能靠自己的努力来获取自己想要的幸福。
紧张的牛牛等一个of...:在担心什么呢,有一手985的学历在,就算是小厂别人都会要的,咱们双非的人更多,多少还在沉沦的,怕什么了
一句话证明你在找工作
点赞 评论 收藏
分享
牛至超人:把哈工大,再加大加粗,看见闪闪发光的哈工大字样,面试官直接流口水
投递字节跳动等公司7个岗位
点赞 评论 收藏
分享
评论
17
10
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务