面试总结

您所在的位置:网站首页 纯虚函数怎么声明 面试总结

面试总结

#面试总结 | 来源: 网络整理| 查看: 265

本文分为四个部分。c++面试常问题,计算机网络常问题和操作系统常问题,以及自己找工作的过程。

c++面经多态1. 谈谈你对多态的理解?

多态,就是一个对象在不同的时刻体现出来的不同的状态。在c++中,多态可以分为静态多态和动态多态。静态多态是通过重载和模板实现的,动态多态是通过虚函数实现的。

c++中的动态多态,简单的说,就是在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时,将会根据指针的类型来调用相应的函数。这样就实现了在运行时,根据不同的对象来调用不同的函数。若指针所指的对象是基类,就调用基类中的函数,若指针所指的对象是派生类,就调用派生类中的函数。多态的实现基于虚函数,虚函数的实现基于虚函数表。

实现多态的过程:编译器在发现基类中有virtual关键字时,会为含有虚函数的类生成一份虚函数表,虚函数表是一个一维数组,在虚函数表中保存了虚函数的入口地址。编译器会在每个对象的前四个字节中保存一个虚表指针,指向对象所属类中的虚表,在构造时,根据对象的类型去初始化虚表指针,这样就实现了在运行时,根据不同的对象来调用不同的函数。派生类的构造函数晚于基类的构造函数,在初始化一个派生类的对象时,会先调用基类的构造函数,在此时,编译器将虚表指针先指向基类的虚表,然后再调用派生类的构造函数,此时,虚表指针指向派生类的虚表,这样就实现了在运行时,根据不同的对象来调用不同的函数。

c++的多态是通过动态绑定来实现的,含有虚函数的类都有自己的虚表。当派生类没有对基类中的虚函数进行重写时,派生类中的虚表指针保存的是父类的虚表,当派生类中自己含有虚函数时,在虚表中将此虚函数的地址添加在后边。

2. 什么是虚函数?什么是纯虚函数?为什么有了虚函数还要有纯虚函数?

被virtual关键字修饰的类非静态成员函数称为虚函数。只有类的非静态成员函数可以加virtual关键字,普通函数不能加virtual关键字。

纯虚函数是没有函数体的虚函数。纯虚函数在基类中被定义,但是在基类中并不实现,在所有的派生类中必须实现。

为了实现多态,我们常常需要在基类中定义虚拟函数,但是,在很多情况下,基类本身生成对象不合情理,因此,我们需要将基类中的虚函数定义为纯虚函数,这样,基类就不能生成对象了,只能作为接口使用。定义纯虚函数的目的就在于,使派生类仅仅只是继承函数的接口。纯虚函数的意义,让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供一个合理的默认实现。所以类纯虚函数的声明就是在告诉子类的设计者,”你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它”。

3. 什么是虚函数表?虚函数表是怎么实现的?

虚函数表是编译器在处理虚函数时引入的一个新成员。编译器在处理虚函数时,给每个对象都添加了一个隐藏成员,隐藏成员中保存了一个指向函数地址数组的指针,这个保存函数地址的数组称为虚函数表,虚函数表中存储了为类成员进行声明的虚函数的地址。

虚函数表在编译器进行编译时创造,且编译器会在构造函数中插入一段代码,用来给虚指针进行赋值。虚函数表放在全局数据区,虚指针放在对象的内存中。

4. 析构函数为什么要声明为虚函数?

如果基类的析构函数不是虚函数,那么在删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数,这样就会造成派生类中的成员没有被释放,造成内存泄漏。

5. 什么是虚继承?虚继承的实现原理是什么?

虚继承是指在派生类中,将多个基类的同一个成员变量视为一个变量,而不是多个变量。虚继承的实现原理是,编译器在派生类中为虚继承的基类添加一个虚基类指针,指向虚基类的对象。

智能指针

智能指针出现的原因,是为了帮助程序员管理使用new运算符在堆区开辟的空间,在需要释放的时候及时的释放,避免造成内存泄露。最早,在c++98标准中就已经有了智能指针的雏形auto_ptr。但是,auto_ptr存在一些问题,比如不能拷贝,不能赋值,不能作为函数的返回值等,因此,c++11标准中引入了智能指针的新标准shared_ptr,weak_ptr和unique_ptr。

1. 智能指针的实现原理是什么?

智能指针的实现原理是,智能指针是一个类,类中有一个指针,指向堆中的对象,当智能指针被销毁时,会调用析构函数,析构函数中会调用delete,从而释放堆中的对象。

计算机网络面经操作系统面经求职过程实习 实习简历投递的第一家公司是pdd,开的早,就直接投了。但是时间跟别的事情冲突了没有做笔试,寄。 第二家是百度,这次做了笔试,无消息,进池子了。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3