使用虚拟的破坏顺序

bre*_*ett 10 c++ destructor virtual-destructor

当我使用虚函数时,有人可以帮助解决破坏的顺序.它是从基类开始,然后是派生类吗?

sbi*_*sbi 13

由于我没有看到虚函数如何改变任何对象的破坏顺序,我假设你指的是虚拟继承场景中基类和数据成员的破坏顺序.

构造子对象

  1. 基类从大多数基础到大多数基础构建;
  2. 多个基类按其声明的顺序构造为基类 ;
  3. 虚拟基类是在所有其他类之前构建的,它们之间遵守上述两个规则;
  4. 数据成员是在封闭对象的构造函数的主体执行之前按其声明的顺序构造的.

破坏只是建筑的反面,所以你只需要记住上面的内容.

但是,上面的四个规则是按顺序排列的,因为这是有道理的,如果你理解为什么这个顺序有意义,你甚至不必记住这四个规则,但可以从你的理解中推断它们(正如我刚才所做的那样).那么让我们检查一下这个顺序:

  • 您可能希望使用基类从派生类的构造函数提供的任何服务.当然,在实际构造之前,不能使用(基础)类对象.因此,在构造派生类时,需要已经构造了基类.(顺便提一下,这也解释了为什么虚函数调度不能完全在构造函数中工作:构造子对象时,只构造了基类的子对象;派生类的子对象还没有因此,不能将对虚函数的调用分派给派生类.一如既往,析构函数是相同的,只是向后.)
  • 由于多个基类是相同的兄弟,所以必须任意挑选一些订单.最终,声明的顺序是最简单的使用顺序.数据成员也是相同的兄弟姐妹,遵循相同(或多或少任意)的声明顺序规则.
  • 虚拟基类是奇怪的野兽.因为永远只有一个虚拟基类的子对象,所以有一个特殊规则表明它总是需要首先构造,直接来自最派生类的构造函数.(这就是为什么虚拟基类最适合作为抽象基类而没有数据且只有默认构造函数的原因.)


Mar*_*ork 5

假设您已将析构函数正确声明为虚拟.

然后以完全相反的构造顺序进行破坏.

总的来说,这将是:

A)从最派生的类开始.
B)递归地重复以下步骤.

1)执行析构函数代码.
2)执行每个成员的析构函数(以创建的相反顺序)
3)执行父类的析构函数.(如果创建的顺序不止一个)

如果你使用虚拟继承,那么事情会略有不同,因为基类构造的顺序与正常情况不同.但是破坏的顺序总是与构造顺序相反.