析构函数调用顺序的原因要求。

时间:2010-08-31 18:09:56

标签: c++ destructor

正如我在某些论坛中所读到的,当创建派生类对象时,基类成员和方法在内存中分配空间,但没有特定的基类对象。

现在由于派生类对象超出范围,为什么首先调用派生类析构函数。编译器的约束是什么,在基类析构函数之后无法调用派生类析构函数。?

如果我的理解错误,请纠正我。谢谢提前

4 个答案:

答案 0 :(得分:7)

当创建派生类对象时, 是一个特定的基类对象(实际上是子对象)。即,当您创建派生对象时,基类ctor用于初始化派生对象中的基类subj-object,并且只有在完成之后派生类ctor才能执行其操作,初始化添加在其中的任何成员。派生类等。

因为它是从基础构建到派生的,所以它从派生到基础都被拆除了。当派生的dtor结束执行时,仍然应该有一个完全有效的基础对象等待基础dtor来销毁它。但是,如果您首先尝试销毁基础子对象,则在运行派生的dtor时,您将不再拥有要派生的dtor的有效派生对象。

答案 1 :(得分:7)

派生类析构函数可以访问基类成员,因此它需要基类对象处于有效状态。

答案 2 :(得分:5)

调用类X析构函数,调用它的对象不再是X类型的对象。

假设您有一个继承自Y的班级X,以及一个继承自Z的班级Y。根据面向对象的继承原则,每个Y 都是一个X。每个Z YX

如果从大多数派生到基础调用析构函数,请查看删除类型为Z的对象时会发生什么:

  • 首先执行Z析构函数。 该对象不再是Z和 恢复为Y

  • 然后执行Y析构函数。该 对象停止为Y并恢复 只是一个X

  • 然后执行X析构函数。该 对象不再是X,现在就是 什么都没有(完全是 破坏)。

现在考虑如果首先调用基础析构函数会发生什么:

  • 首先执行X析构函数。对象不再是X

现在对象是什么?它不是X,但它不能是Y,因为Y X。它不能是Z,因为Z 也是X!此时对象没有明确定义的类型,因此调用另一个方法,即使是另一个析构函数,也会导致无法定义的行为。

更具体地说:Z析构函数或Y析构函数完全有可能需要访问X类中定义的内容。所以X析构函数必须最后运行。请注意,在其他方向上没有问题,因为基类X无法访问其派生类中的任何内容。

答案 3 :(得分:0)

你可以使用一个小技巧: 派生类的成员的析构函数 在调用整个析构函数堆栈后调用

我现在已经使用std :: map类型的成员重新测试了 似乎并非如此。 SORRY。