嵌入式面经大全(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

相关推荐

想run的马里奥在学...:这个学历帮你扫平百分之80的障碍,投就完了,这会找不到就等3月暑期一样能找到
点赞 评论 收藏
分享
2025-12-19 21:53
门头沟学院 Java
想做OpenGL:不要一来就把自己定位这么低吧,把大厂当成目标,不断去学技术做项目,最后你至少能学到能找到中小厂的技术水平,你一上来就找这种两千块还要前后端都会的,其实对你用处不会很大,真去了也是打杂
点赞 评论 收藏
分享
评论
17
10
分享

创作者周榜

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