首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用虚拟的销毁顺序

使用虚拟的销毁顺序
EN

Stack Overflow用户
提问于 2010-08-18 05:29:18
回答 7查看 6.6K关注 0票数 10

谁能帮帮忙,当我使用虚拟函数时,销毁的顺序是什么?它是从基类开始,然后是派生类吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-08-18 05:43:56

由于我看不到虚拟函数如何更改任何对象的销毁顺序,因此我假设您指的是虚拟继承场景中基类和数据成员的销毁顺序。

子对象是由构造的

  1. base类是从大多数基类到大多数derived;
  2. multiple基类构造的;按照它们声明为基类的顺序构造;遵循上述两条规则,在所有其他基类之前构造基类;按照成员的declaration.

顺序,在执行封闭对象的构造函数主体之前构造成员

销毁是与构造相反的,所以你只需要记住上面的内容。

然而,上面的四个规则是按这个顺序排列的,因为这是有意义的,如果你理解了为什么这个顺序是有意义的,你甚至不需要记住这四个规则,但可以从你的理解中推断出它们(就像我刚刚做的那样)。因此,让我们检查一下该顺序:

  • 您可能想要使用基类从派生类的构造函数提供的任何服务。当然,在实际构造(基类)对象之前,您不能使用它。因此,在构造派生类时,需要已经构造基类。(顺便说一下,这也解释了为什么虚函数调度不能从构造函数中完全工作:当构造子对象时,只有基类的子对象已经构造;派生类的子对象还没有构造。因此,不能将对虚函数的调用调度到派生类。像往常一样,析构函数是相同的,只是向后。)
  • 由于多个基类是相等的兄弟,所以必须任意选择一些顺序。最终,声明的顺序是最容易使用的。同样是同级的数据成员遵循相同的(或多或少是任意的)声明顺序的rule.
  • Virtual基类是奇怪的野兽。因为总是只有一个虚拟基类的子对象,所以有一个特殊的规则,它总是需要首先从大多数派生类的构造函数开始构造。(这就是为什么虚拟基类作为没有数据的抽象基类工作得最好,只有默认的constructors.)
票数 14
EN

Stack Overflow用户

发布于 2010-08-18 05:32:19

销毁顺序是反向的构造顺序。我最近做了一个小工具来显示任何层次结构的构造顺序。看这里:

在图中,具有较小数量的节点被构造为first和destructed last

票数 1
EN

Stack Overflow用户

发布于 2010-08-18 17:19:57

第12.6.2/5节:

初始化应按以下顺序进行:

首先,并且仅对于如下所述的最多派生类的构造函数,虚拟基类应该按照它们在基类的有向无循环图的深度优先从左向右遍历时出现的顺序来初始化,其中,“从左到右”是派生类中基类名称的出现顺序base-specifier-list.

  • Then,直接基类应该按照它们在基说明符列表中出现的声明顺序来初始化(不管mem-initializers).

  • Then,的顺序如何非静态数据成员应该按照在类定义中声明的顺序进行初始化(同样,不管mem-initializers的顺序如何)。-最后,执行构造函数的主体。

注意:声明顺序是为了确保基对象和成员子对象以与初始化相反的顺序被销毁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3507100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档