面试题答案
一键面试当通过基类指针删除派生类对象时,将Base类的析构函数声明为虚函数是必要的。这样可以确保在删除派生类对象时,派生类的析构函数能够被正确调用,避免内存泄漏。
示例代码如下:
#include <iostream>
class Base {
public:
// 这里将析构函数声明为虚函数
virtual ~Base() {
std::cout << "Base destructor" << std::endl;
}
};
class Derived : public Base {
private:
int* data;
public:
Derived() {
data = new int(10);
std::cout << "Derived constructor" << std::endl;
}
~Derived() {
delete data;
std::cout << "Derived destructor" << std::endl;
}
};
int main() {
Base* ptr = new Derived();
delete ptr;
return 0;
}
在上述代码中,如果Base类的析构函数不是虚函数,当通过Base*
指针delete
派生类对象时,只会调用Base类的析构函数,而不会调用Derived类的析构函数,从而导致Derived
类中data
指向的内存无法释放,造成内存泄漏。将Base类的析构函数声明为虚函数后,delete ptr
时会先调用Derived类的析构函数,释放data
,然后再调用Base类的析构函数。