MST

星途 面试题库

面试题:C++ 中虚析构函数在继承体系中的作用

在一个简单的C++ 继承体系中,基类有一个虚析构函数,派生类也有自己的析构函数。请解释为什么在这种情况下基类的析构函数需要设为虚函数,并且说明如果基类析构函数不是虚函数,可能会出现什么问题。
25.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

为什么基类的析构函数需要设为虚函数

当通过基类指针删除派生类对象时,如果基类析构函数是虚函数,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 所指向的内存无法释放,造成内存泄漏。