总结了一些常见的面试题,通过查阅资料给出了一些浅薄的解析,欢迎各位批评指教。

1. inliine函数可以实虚函数码?

不可以,因为inline函数没有地址,无法将他存放到虚函数表中。

2. 静态成员可以是虚函数吗?

不能,因为静态成员函数中没有this指针,使用::成员函数的嗲用用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。

3. 构造函数可以是虚函数吗?

不可以,因为对象中的虚函数指针是在对象构造的时候初始化的。

4. 析构函数可以是虚函数吗?什么场景下析构函数是虚函数?

可以,最好将析构函数设置为虚函数最好是将父类的析构函数设置为虚函数 ,因为这样可以避免内存泄漏的问题。如果一个父类的指针指向了子类的的对象,并且父类的虚函数没有设置成虚函数,那么子类对象中的虚函数就没有实现多态,他只会调用父类的析构函数,不会调用子类的析构函数,但是他创建对象的时候调用了子类的构造函数,所以说就用子类的构造函数就应该该取调用他的析构函数,这样才能保证所有的必须释放的资源都是放了,才可以保证不会有内存泄漏。如果是多态的,就会先去调用子类的析构函数,然后再取调用父类的析构函数,这样子类和父类的资源就都可以释放。

5. 对象访问普通函数快还是虚函数快?

如果是普通对象,是一样快的,如果是指针对象或者是引用对象,调用普通函数更快一些,因为构成了多态,运行时调用虚函数要先到虚函数表中去查找。这样然后才拿到韩式的地址,这样就不如直接可以拿到函数地址的普通函数快。

6. 虚函数表时再什么阶段生成的?他存放在哪里?

虚函数时再编译阶段生成的,他一般存放再代码段,也就是常量区。

7. 执行下面这段代码的结果

#include <iostream>
using namespace std;class Base
{public:virtual void x(){cout << "Base::x" << endl;}void y(){x();cout << "Base::y" << endl;}
};class Derive : public Base
{public:virtual void x(){cout << "Derive::x" << endl;}void y(){cout << "Derive::y" << endl;}
};int main()
{Base* p = new Derive;p->y();return 0;
}

解析:很显然Derive继承了Base,并且实现了多态,但是只有x()是虚函数重写,y()只在子类中声明了虚函数,没有在父类中声名所以不能y()不是虚函数重写,而是对父类中的y()重定义,所以在p调用y()的时候直接调用Base中的y(),在Base的y()中调用了x(),由于x()在子类中构成了虚函数重写,所以调用子类中的x(),答案也就不晓而知了。

8. 是否可以将类中的所有成员函数都声明称为虚函数,为什么?

虚函数是在程序运行的时候通过寻址操作才能确定真正要调用的的函数,而普通的成员函数在编译的时候就已经确定了要调用的函数。这个两者的区别,从效率上来说,虚函数的效率要低于普通成员函数,因为虚函数要先通过对象中的虚标指针拿到虚函数表的地址,然后再从虚函数表中找到对应的函数地址,最后根据函数地址去调用,而普通成员函数直接就可以拿到地址进行调用,所以没必要将所有的成员函数声明成虚函数。

9. 虚函数表指针被编译器初始化的过程怎么理解的?

当类中声明了虚函数是,编译器会在类中生成一个虚函数表VS中存放在代码段,虚函数表实际上就是一个存放虚函数指针的指针数组,是由编译器自动生成并维护的。虚表是属于类的,不属于某个具体的对象,一个类中只需要有一个虚表即可。同一个类中的所有对象使用同一个虚表,为了让每个包含虚表的类的对象都拥有一个虚表指针,编译器在每个对象的头添加了一个指针,用来指向虚表,并且这个指针的值会自动被设置成指向类的虚表,每一个virtaul函数的函数指针存放在虚表中,如果是单继承,先将父类的虚表添加到子类的虚表中,然后子类再添加自己新增的虚函数指针,但是在VS编译器中我们通常看不到新添加的虚函数指针,是编译器故意将他们隐藏起来,如果是多继承,在子类中新添加的虚函数指针会存放在第一个继承父类的虚函数表中。

10. 多态的分类?

静态绑定的多态的是通过函数的重载来实现的。动态绑定的多态是通过虚函数实现的。

11. 为什么要引入抽象类和纯虚函数?

为了方便使用多态特性,在很多情况下由基类生成对象是很不合理的,纯虚函数在基类中是没有定义的,要求在子类必须加以实现,这种包含了纯虚函数的基类被称为抽象类,不能被实例化,如果子类没有实现纯虚函数,那么它他也是一个抽象类。

12. 虚函数和纯虚函数有什么区别?

从基类的角度出发,如果一个类中声明了虚函数,这个函数是要在类中实现的,它的作用是为了能让这个函数在他的子类中能被重写,实现动态多态。纯虚函数,只是一个接口,一个函数声明,并没有在声明他的类中实现。对于子类来说它可以不重写基类中的虚函数,但是他必须要将基类中的纯虚函数实现。虚函数既继承接口的同时也继承了基类的实现,纯虚函数关注的是接口的统一性,实现完全由子类来完成。

13. 什么是多态?他有什么作用?

多态就是一个接口多种实现,多态是面向对象的三大特性之一。多态分为静态多态和动态多态。静态多态包含函数重载和泛型编程,进程多态是程序调用函数,编译器决定使用哪个可执行的代码块。静态多态是由继承机制以及虚函实现的,通过指向派生类的基类指针或者引用,访问派生类中同名重写成员函数。堕胎的作用就是把不同子类对象都当作父类来看,可以屏蔽不同子类之间的差异,从而写出通用的代码,做出通用的编程,以适应需求的不断变化。

C++多态面试题汇总相关推荐

  1. 程序员必看 c++笔试题汇总

    ①链表反转 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题.比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3-& ...

  2. 超全!iOS 面试题汇总

    超全!iOS 面试题汇总 2015-10-20 CocoaChina 作者:Job_Yang 之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家. ...

  3. 网易校园招聘历年经典面试题汇总:C++研发岗

    这个系列计划收集几百份朋友和读者的面经,作者合集方便查看,各位有面经屯着可以联系我哦 这个系列离结束差的还特别多,会更新涵盖所有一线大厂的所有岗位,也可以关注一下. 腾讯校园招聘历年经典面试题汇总:前 ...

  4. 百度校招历年经典面试题汇总:Java开发岗

    这个系列计划收集几百份朋友和读者的面经,作者合集方便查看,各位有面经屯着可以联系我哦 这个系列离结束差的还特别多,会更新涵盖所有一线大厂的所有岗位,也可以关注一下. 百度校园招聘历年经典面试题汇总:C ...

  5. 校招笔试C语言,校招c ++笔试题汇总

    ①链表反转 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题, 最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后 ...

  6. unity算法面试_Unity面试题汇总

    <Unity面试题汇总>由会员分享,可在线阅读,更多相关<Unity面试题汇总(52页珍藏版)>请在人人文库网上搜索. 1.一. C#语言1. 重载和重写的区别1) 所处位置不 ...

  7. Java面试题汇总大杂汇

    Socket面试题整理 Socket是什么? socket是应用层与传输层的一个抽象,将复杂的TCP/IP协议隐藏在Socket接口之后,只对应用层暴露简单的接口 socket是一种特殊的文件,它也有 ...

  8. C++软件工程师面试题汇总

    C++面试题汇总(持续更新中.......) 简介 c++ 问题汇总 问题一:继承和多态的区别? 问题二:结构体和联合体的区别? 问题三:重载和重写的区别? 问题四:struct和class的区别? ...

  9. 百度校园招聘历年经典面试题汇总:C++研发岗

    这个系列计划收集几百份朋友和读者的面经,作者合集方便查看,各位有面经屯着可以联系我哦 这个系列离结束差的还特别多,会更新涵盖所有一线大厂的所有岗位,也可以关注一下. 最容易进的大厂工作,百度经典百题 ...

最新文章

  1. pandas删除dataframe列名称中包含特定字符串的数据列(dropping columns contains specifiec substring in dataframe)
  2. 妙用 Intellij IDEA 创建临时文件,Git 跟踪不到的那种
  3. mysql 5.7 centos 7_CentOS 7 下 MySQL 5.7 的安装与配置
  4. 测试工具iometer, iozone, bonnie++
  5. 二层交换网络_网络中的第2层交换
  6. 多语言网站开发 不完全技术分析收录
  7. vld不输出泄漏信息_UV固化设备不单单只有灯管!还有哪些辅动部件?
  8. 计算机大作业visio选题,大作业一 用Visio绘网络结构图
  9. Java网络编程——Socket
  10. 【渝粤教育】广东开放大学 中国文化文学通论 形成性考核 (25)
  11. EasyCVR接入Ehome协议设备PS流解析失败?一文分析PS流解析注意点
  12. 微型计算机原理与接口技术 考题,微机原理与接口技术试题答案
  13. 毛伟:重塑网络根基——国际形势使然,技术升级必然
  14. Web漏洞总结: OWASP Top 10
  15. msl3等级烘烤时间_MSL等级说明
  16. JAVA提取纯文本_从常见文档中提取纯文本内容 | IT人生录
  17. QDataTime格式互转
  18. Java之动态代理类实现日志简单实例
  19. 由“西游记”的唐僧扫塔想到的
  20. BeanCurrentlyInCreationException异常分析及解决

热门文章

  1. 机器学习竞赛中,为什么GBDT往往比深度学习更有效?
  2. 如果你跟夕小瑶恋爱了...(下)
  3. 一篇文章彻底搞懂“分布式事务”
  4. 实时事理逻辑知识库(事理图谱)终身学习项目-EventKGNELL(学迹)
  5. 【转】常用数学函数篇(Linux c)
  6. Attention Model
  7. Android开发艺术探究Note
  8. iOS事件的响应和传递机制
  9. iOS 的 XMPPFramework 简介
  10. redis 安装并设置为开机启动服务