1.cpp中的虚函数和虚函数表
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数
虚函数表是指在每个包含虚函数的类中都存在着一个函数地址的数组。当我们用父类的指针来操作一个子类的时候,这张虚函数表指明了实际所应该调用的函数。
C++的编译器保证虚函数表的指针存在于对象实例中最前面的位置,这样通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。
单继承:1.虚函数子类覆盖父类 2.父类位于子类前面
多继承:1.按声明顺序放 2.虚函数子类覆盖父类
解释:
父类和子类都有"相同"原型的虚函数,才能根据父类指针指向的对象类型不同,在调用父类或子类的虚函数时表现出多态。父类有虚函数而子类没有,或反之,不能表现出多态行为。当用父类指针调用一个函数时,不管该函数是不是虚函数,它一定要在本指针所属的父类存在,否则编译因找不到函数肯定会报错
2.new和malloc的区别
参考https://www.cnblogs.com/qg-whz/p/5140930.html
3.overload、override、overwrite的区别
4.shared_ptr和weak_ptr;shared_ptr循环引用问题和解决
C++中经常需要new一个对象,开辟一个内存空间,返回一个指针来操作这个内存。使用完毕之后,需要通过delete来释放内存空间。如果内存没有释放,那这块内存将无法再利用,导致内存泄漏。为降低人为疏忽,C++ 11的新特性中引入了三种智能指针,来自动化地管理内存资源
shared_ptr基于“引用计数”模型实现,多个shared_ptr可指向同一个动态对象,并维护了一个共享的引用计数器,记录了引用同一对象的shared_ptr实例的数量。当最后一个指向动态对象的shared_ptr销毁时,会自动销毁其所指对象(通过delete操作符)
weak_ptr用于解决“引用计数”模型循环依赖问题,weak_ptr指向一个对象,并不增减该对象的引用计数器
一个强引用当被引用的对象活着的时候,这个引用也存在
弱引用当引用的对象活的时候不一定存在 。仅仅是当它存在的时候的一个引用。弱引用并不修改该对象的引用技术,这意味这弱引用它并不对对象的内存进行管理,在功能上类似普通的指针,然而一个比较大的区别是:弱引用能检测到所管理的对象是否已经被释放,从而避免访问非法内存
进行该对象的内存管理的是那个强引用的shared_ptr。weak_ptr只是提供了对管理对象一个访问手段。但这种方式必须在程序员能预见会出现循环引用的情况下才能使用,也可以是说这个仅仅是一种编译期的解决方案
5.cpp中 进程栈和堆区别作用
申请方式:stack系统分配;heap程序员制定大小 malloc new
申请resp:stack剩余空间大于申请空间;heap来说os有一个记录空闲内存的链表,寻找第一个大于空间的堆节点,并记录实际大小,把剩下的重新放入链表
申请大小:stack向下,连续空间,windows是2M,会overflow;堆向上不连续,受限于虚拟内存
申请效率:stack快,heap满容易碎片
存储位置:stack首先进第一条指令,然后是各个参数(从右往左),然后局部变量;heap记录大小,然后具体内容;
stack是由系统提供的,有专门寄存器和机器指令支持
heap是函数库提供的,但更灵活