MST
星途 面试题库

面试题:C++子类析构时父类析构函数调用机制的基础考察

请描述在C++中,当子类对象被销毁时,父类析构函数是如何被调用的?如果父类析构函数没有声明为虚函数,会出现什么情况?
34.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 子类对象销毁时父类析构函数的调用过程
    • 当子类对象被销毁时,首先会调用子类的析构函数。在子类析构函数执行完毕后,会自动调用其父类的析构函数。这是C++对象生命周期管理的一部分,确保对象在销毁时,从子类到父类的资源都能被正确释放。例如:
class Parent {
public:
    ~Parent() {
        std::cout << "Parent destructor called" << std::endl;
    }
};

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

int main() {
    Child child;
    return 0;
}
  • 上述代码中,当child对象超出作用域被销毁时,会先输出Child destructor called,然后输出Parent destructor called
  1. 父类析构函数未声明为虚函数的情况
    • 如果父类析构函数没有声明为虚函数,当通过父类指针或引用删除子类对象时,只会调用父类的析构函数,而不会调用子类的析构函数。这会导致子类中分配的资源无法被正确释放,从而产生内存泄漏等问题。例如:
class Parent {
public:
    ~Parent() {
        std::cout << "Parent destructor called" << std::endl;
    }
};

class Child : public Parent {
private:
    int* data;
public:
    Child() {
        data = new int[10];
    }
    ~Child() {
        delete[] data;
        std::cout << "Child destructor called" << std::endl;
    }
};

int main() {
    Parent* parentPtr = new Child();
    delete parentPtr;
    return 0;
}
  • 在上述代码中,由于Parent的析构函数不是虚函数,当delete parentPtr时,只会调用Parent的析构函数,Child的析构函数不会被调用,Child类中data所指向的内存无法释放,造成内存泄漏。所以,在多态场景下,父类析构函数通常应声明为虚函数。