面试题答案
一键面试- 当基类析构函数是虚函数时:
- 当执行
delete basePtr;
时,由于basePtr
指向Derived
类型对象,且基类Base
的析构函数是虚函数,C++运行时系统会根据对象的实际类型(即Derived
类型)来调用相应的析构函数。 - 首先调用
Derived
类的析构函数。在Derived
类的析构函数中,会清理Derived
类中声明的成员变量所占用的资源,例如动态分配的内存等。 - 然后,在
Derived
类析构函数执行完毕后,会自动调用基类Base
的析构函数。基类Base
的析构函数会清理Base
类中声明的成员变量所占用的资源。这样就确保了整个对象(包括基类和派生类部分)所占用的资源都能被正确释放。
- 当执行
- 当基类析构函数不是虚函数时:
- 当执行
delete basePtr;
时,由于basePtr
的静态类型是Base*
,且基类Base
的析构函数不是虚函数,C++只会调用基类Base
的析构函数。 - 这样就导致
Derived
类中声明的成员变量所占用的资源无法被清理,从而产生内存泄漏。因为Derived
类的析构函数没有被调用,它内部动态分配的资源(如果有的话)就不能被释放。
- 当执行