虚拟析构函数用例

Virtual destructor use cases

本文关键字:析构函数 虚拟      更新时间:2023-10-16

我读过一些文章,正如他们所说,主要的虚拟析构函数用例有:

  • 派生的类可能具有来自堆的动态数据分配,即"拥有"该数据对象。所以,它们需要一些析构函数中的删除例程。通过base类指针删除需要所有派生类别中析构函数的virtual声明,直到那些具有动态数据分配的类别(baseclass也需要它(

  • 这个类有virtual方法。但我不清楚这一点。仅仅通过base类指针调用virtual方法总是会产生最多的派生实现调用。他们唯一排除的规则是施工阶段。从字面上看,在此过程中,this对象还不是派生的类型,即使稍后会是。好吧,销毁阶段呢?据我所知,这条规则是按后序排列的。不管层次结构中某个类的析构函数是否被声明为virtual,在每个析构函数期间,this指针都被当作该类类型使用,任何派生的都已经由于virtual d-r而被销毁,或者没有被销毁(假设在某些设计中这可能是可以的(。也许是这样,为什么d-r必须是虚拟的?Vtable将具有派生的类的条目,并且从d-r调用某些类别中的virtual方法将导致UB?好的,但这个规则只适用于这个类调用d-r中的一些virtual方法的情况,并且它们在派生的类中确实有实现。

我的观点是,也可能存在没有动态数据分配的情况,在所有层次结构中都没有虚拟方法,但仍然派生的析构函数可以在删除时执行一些关键任务(同步、解锁等(。我们需要基类中的虚拟d-r。这种情况可能是由于设计不好造成的。

但无论如何,一些公共类的开发人员不可能100%知道派生类是否会在d-r中使用一些虚拟方法,或者分配动态数据。那么,我正确地说,任何未声明为final的公共类都必须声明d-r为虚拟的吗?只有final关键字可以保证指向此类的任何指针始终是这种类型,因此可以安全地非虚拟删除。

如果通过指向基类的指针删除派生对象,则(并且仅限于此(基类析构函数必须是虚拟的。否则就是未定义的行为。没有其他相关规则。

如果这个类有一个虚拟函数,那么就不会引入任何开销。如果该类没有任何其他虚拟函数,则基类设计器必须考虑添加虚拟析构函数的运行时惩罚与该类的用户可能试图通过基类指针删除派生对象的风险之间的权衡。

这里有一个类似讨论的链接,标准报价