繁体   English   中英

虚拟析构函数用例

[英]Virtual destructor use cases

我已经阅读了一些文章,正如他们所说,主要的虚拟析构函数用例是:

  • 派生类可以从堆中动态分配数据,即“拥有”该数据对象。 因此,他们需要一些析构函数中的删除例程。 通过类指针进行删除需要在所有派生类中virtual声明析构函数,直到那些具有动态数据分配的析构函数为止( 类也需要它)

  • 此类具有virtual方法。 但这对我来说还不清楚。 仅通过类指针调用virtual方法总是导致最派生的实现调用。 他们只排除该规则是建设阶段。 从字面上看,在this期间, this对象还不是派生类型,即使以后会是。 好吧,破坏阶段呢? 据我了解,该规则是后向的。 没关系,如果某个层次结构中的某个类的析构函数被声明为virtual ,则在每个析构函数期间都将使用this指针,就像该类类型一样,任何派生对象都已由于virtual dr而被破坏,或者没有被破坏(并且假设在一些设计)。 也许是这样,为什么博士必须是虚拟的? Vtable将具有派生类的条目,并且从dr在某些类中调用virtual方法会导致UB? 好的,但是该规则仅适用于此类在dr中调用某些virtual方法并且在派生类中确实实现的情况。

我认为,也可能存在没有动态数据分配,在所有层次结构中都没有虚拟方法的情况,但是仍然派生的析构函数在删除后可能会执行一些关键任务(同步,解锁等)。 我们需要基类中的虚拟博士。 可能是这种情况是不良设计的结果。

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

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

如果该类仍然具有虚函数,则不会引入任何开销。 如果该类没有任何其他虚函数,则基类设计者必须考虑在添加虚拟析构函数的运行时代价与类用户可能尝试通过以下方式删除派生对象的风险之间的权衡:基类指针。

这是带有类似引号的类似讨论的链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM