乐闻世界logo
搜索文章和话题

Does delete on a pointer to a subclass call the base class destructor?

4 个月前提问
3 个月前修改
浏览次数16

1个答案

1

在C++中,如果您想确保在删除指向子类的指针时调用适当的析构函数(包括基类和派生类的析构函数),您需要在基类中将析构函数声明为虚拟的(virtual)。这样可以启动多态,使得通过基类指针删除时可以调用正确的析构函数序列。

例子说明

假设有一个基类 Base 和一个从 Base 派生的类 Derived

cpp
#include <iostream> class Base { public: Base() { std::cout << "Base constructor called\n"; } virtual ~Base() { std::cout << "Base destructor called\n"; } }; class Derived : public Base { public: Derived() { std::cout << "Derived constructor called\n"; } ~Derived() override { std::cout << "Derived destructor called\n"; } }; int main() { Base* b = new Derived(); delete b; // 正确调用 Derived 的析构函数,然后是 Base 的析构函数 return 0; }

输出

shell
Base constructor called Derived constructor called Derived destructor called Base destructor called

在这个例子中,由于 Base 类的析构函数被声明为虚拟的,当通过指向 Derived 类的 Base 类指针删除对象时,首先调用 Derived 类的析构函数,然后调用 Base 类的析构函数。如果 Base 类的析构函数不是虚拟的,则只会调用 Base 类的析构函数,这可能导致资源泄露或其他未定义的行为,因为 Derived 类的特定析构逻辑没有被执行。

结论

通过使基类的析构函数虚拟,可以保证析构过程中资源的正确释放和对象的适当清理,这是处理多态对象的一种重要和安全的做法。

2024年6月29日 12:07 回复

你的答案