MST
星途 面试题库

面试题:C++中关于子类析构调用父类析构的常规实现

请编写一段C++代码,包含一个父类和一个子类,在子类的析构函数中正确调用父类的析构函数,并解释为什么要这样做。
13.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

class Parent {
public:
    Parent() {
        std::cout << "Parent constructor" << std::endl;
    }
    virtual ~Parent() {
        std::cout << "Parent destructor" << std::endl;
    }
};

class Child : public Parent {
public:
    Child() {
        std::cout << "Child constructor" << std::endl;
    }
    ~Child() override {
        std::cout << "Child destructor" << std::endl;
        // 父类析构函数会被自动调用,无需显式调用
    }
};

在C++中,当子类对象被销毁时,子类的析构函数会首先执行,然后会自动调用父类的析构函数。这是语言机制保证的,目的是确保对象在销毁时,其继承体系中的所有部分都能得到正确清理。如果父类中有需要释放的资源(如动态分配的内存、打开的文件句柄等),父类析构函数负责清理这些资源,通过这种自动调用机制,可以保证资源的正确释放,避免资源泄漏。如果父类析构函数不是虚函数,当通过父类指针删除子类对象时,可能只会调用父类析构函数而不会调用子类析构函数,导致子类部分资源无法释放,所以通常将父类析构函数声明为虚函数。在这个例子中,虽然不需要显式调用父类析构函数,但父类析构函数声明为虚函数是一种良好的编程习惯。