网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- 以下关于纯虚函数的说法,正确的是( A )
A:声明纯虚函数的类不能实例化对象 B:声明纯虚函数的类是虚基类
C:子类必须实现基类的纯虚函数 D:纯虚函数必须是空函数
声明纯虚函数的类是抽象类,虚基类虚拟继承中共享的基类;子类不一定要实现基类的虚基函数,只是子类重写这个虚基函数后才能正确的实例化出对象;空函数是不执行任何语句就返回的函数,显然纯虚函数不是空函数
- 关于虚函数的描述正确的是( B )
A:派生类的虚函数与基类的虚函数具有不同的参数个数和类型 B:内联函数不能是虚函数
C:派生类必须重新定义基类的虚函数 D:虚函数可以是一个static型的函数
派生类的虚函数重写必须遵循三同:虚函数名,返回值,参数类型和个数,只有在协同的特殊情况下,返回值可以为父子类关系;inline 修饰的函数使用 virtual 修饰后,地址就会被放到虚表中去,因此不再具有内联特性;派生类可以不重新定义基类的虚函数;虚函数是通过对象的 this 指针来调用的,而 static 修饰的函数是属于这个类的,与任何实例对象都不相关。
- 关于虚表说法正确的是( D )
A:一个类只能有一张虚表
B:基类中有虚函数,如果子类中没有重写基类的虚函数,此时子类与基类共用同一张虚表
C:虚表是在运行期间动态生成的
D:一个类的不同对象共享该类的虚表
多继承中可能会有多个虚表;子类如果没有重写虚函数,会将父类的虚表拷贝下来,且虚表是在编译阶段生成的,只是虚函数表指针是在运行时被赋值的,虚表是属于这个类的,实例化出的对象共用这个虚表
- 假设A类中有虚函数,B继承自A,B重写A中的虚函数,也没有定义任何虚函数,则( D )
A:A类对象的前4个字节存储虚表地址,B类对象前4个字节不是虚表地址
B:A类对象和B类对象前4个字节存储的都是虚基表的地址
C:A类对象和B类对象前4个字节存储的虚表地址相同
D:A类和B类虚表中虚函数个数相同,但A类和B类使用的不是同一张虚表
每个类都有自己独有的虚表,用自己的虚函数表指针来访问,地址都是不一样的。
- 什么是菱形继承?菱形继承的问题是什么?
菱形继承是是多继承的一种特殊情况:当一个子类(派生类)直接或间接同时继承了两个父类(基类),而这个两个父类(基类)又直接或间接继承自同一个父类(基类),从而形成了一份菱形的继承关系。
问题:菱形继承中,派生类(子类)存储了两份基类(父类)数据的问题,会导致数据访问的二义性问题(不明确访问的是哪一个),和数据冗余问题(同一份数据存了两份)
- 什么是菱形虚拟继承?如何解决数据冗余和二义性的
在继承中使用虚拟继承来解决菱形继承导致的一些问题。
如何解决:在虚拟继承发生菱形继承的派生类的基类中,每个基类在虚拟继承时都添加了一个指针,这个指针指向一个表,叫虚基表,虚基表中存储的是基础基类的成员相对于这两个指针的偏移量,利用这两个虚表中的偏移量通过指针访问的是同一个基础基类的成员变量。访问的是同一个成员,就解决数据二义性的问题;只存一份,通过指针指向虚表的偏移量去访问,就解决了数据冗余问题。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
视频,并且后续会持续更新**