gpt4 book ai didi

c++ - 多态类中的虚析构函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:36 25 4
gpt4 key购买 nike

我知道只要你有一个多态基类,基类就应该定义一个虚析构函数。这样当一个指向派生类对象的基类指针被删除时,会先调用派生类的析构函数。如果我在这里错了,请纠正我。

此外,如果基类析构函数是非虚拟的,则删除指向派生对象的基类指针将是未定义的行为。如果我也错了,请纠正我。

所以我的问题是:为什么当基类析构函数是非虚函数时,对象不会被正确销毁?

我假设这是因为虚函数有某种表格,每当调用虚函数时都会记住和查阅该表格。并且编译器知道当一个对象应该被删除时,它应该首先调用派生的析构函数。

我的假设是否正确?

最佳答案

如果在删除对象时变量的静态类型是 bas 类型,则将调用基类型的析构函数,但不会调用子类的析构函数(因为它是不是虚拟的)。

这样基类分配的资源会被释放,子类分配的资源不会释放。

因此对象不会被正确销毁。

你对那个表是正确的:它被称为虚拟方法表或“vtable”。但是析构函数非虚的结果并不是没有按正确的顺序调用析构函数,而是根本没有调用子类的析构函数!

关于c++ - 多态类中的虚析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29363817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com