- 子类对象销毁时父类析构函数的调用过程:
- 当子类对象被销毁时,首先会调用子类的析构函数。在子类析构函数执行完毕后,会自动调用其父类的析构函数。这是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
。
- 父类析构函数未声明为虚函数的情况:
- 如果父类析构函数没有声明为虚函数,当通过父类指针或引用删除子类对象时,只会调用父类的析构函数,而不会调用子类的析构函数。这会导致子类中分配的资源无法被正确释放,从而产生内存泄漏等问题。例如:
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
所指向的内存无法释放,造成内存泄漏。所以,在多态场景下,父类析构函数通常应声明为虚函数。