MST
星途 面试题库

面试题:C++中析构函数声明为虚函数的场景分析

假设有一个基类Base和一个派生类Derived,Derived类继承自Base类。在什么情况下,将Base类的析构函数声明为虚函数是必要的?请给出具体的代码示例说明。
33.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

当通过基类指针删除派生类对象时,将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类的析构函数。