面试题答案
一键面试为什么基类的析构函数需要设为虚函数
当通过基类指针删除派生类对象时,如果基类析构函数是虚函数,C++ 运行时系统会根据对象的实际类型来调用相应的析构函数。即先调用派生类的析构函数,再调用基类的析构函数,这样可以确保派生类中分配的资源被正确释放。这是因为虚函数机制能够实现动态绑定,在运行时确定实际对象的类型,从而调用合适的析构函数。
如果基类析构函数不是虚函数可能出现的问题
如果基类析构函数不是虚函数,当通过基类指针删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数。这就会导致派生类中分配的资源(如动态分配的内存、打开的文件句柄等)无法得到释放,从而产生内存泄漏和资源泄漏问题。例如:
class Base {
public:
~Base() {} // 非虚析构函数
};
class Derived : public Base {
private:
int* data;
public:
Derived() {
data = new int[10];
}
~Derived() {
delete[] data;
}
};
int main() {
Base* ptr = new Derived();
delete ptr; // 只会调用 Base 的析构函数,不会调用 Derived 的析构函数,data 未释放
return 0;
}
在上述代码中,Derived
类在构造函数中分配了内存,在析构函数中释放内存。但由于 Base
类的析构函数不是虚函数,delete ptr
时不会调用 Derived
的析构函数,data
所指向的内存无法释放,造成内存泄漏。