多态类中的虚拟析构函数

不能思考

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

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

所以我的问题是:为什么当基类析构函数是非虚拟的时,该对象将无法正确销毁呢?

我认为这是因为虚函数具有某种表,每当调用虚函数时都会存储和查询该表。而且编译器知道应该删除一个对象时,它应该首先调用派生的析构函数。

我的假设正确吗?

加伯·安加尔(GáborAngyal)

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

结果,将释放由基类分配的资源,但不会释放由子类分配的资源。

因此,该对象将不会被正确地破坏。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章