vivo面试笔记

vivo面试笔记,面试官问了几个面向对象的问题,可惜很久没看,没回答上来,很遗憾,回来百度并总结了一下,大概是这个意思



当用基类指针指向子类从堆中分配的对象时,如下形式 A*p = new B;当调用delete p;p=NULL;销毁对象时,是调用父类A的析构函数还是调用子类B的构造函数呢?


答案是会调用父类的析构函数,这样问题就来了,子类独有的成员变量的内存将得不到释放,是否会成内存泄露,如果存在,这种情况应该如何避免


运用虚析构函数。


虚析构函数就是在父类的析构函数前加上virtual关键字,这种特性将会被继承下去,也即子类的析构函数也为虚析构函数

将父类的析构函数变为虚析构函数,子类的析构函数继承了这种特性,也变成了虚析构函数,即便子类不写virtual,子类析构函数也是虚析构函数

虚析构函数的使用场合:当存在继承关系,用父类的指针指向从堆中分配的子类的对象时,然后又想用父类的指针去释放掉内存,就会用到虚析构函数,用了虚析构函数后,再调用delete p时,就会先调用子类的析构函数,再调用父类的析构函数,就不会存在内存泄漏问题了。


你可能感兴趣的:(C++)