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

use*_*212 3 c++ destructor

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

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

如果我错误理解了,请纠正我.谢谢

Jer*_*fin 7

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

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


dan*_*n04 7

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


Tyl*_*nry 5

一个类X析构函数被调用,它被调用的对象不再是类型的对象X.

假设您有一个Y继承自X的类,以及一个Z继承自的类Y.按照面向对象的继承原则,每一个Y 都是一个X.每一个Z 都是一个Y和一个X.

Z如果从最大派生到基础调用析构函数,请查看删除类型对象时发生的情况:

  • 首先Z析构函数执行.该对象不再是a Z并且还原为a Y.

  • 然后Y析构函数执行.对象不再是a Y并且还原为a X.

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

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

  • 首先X析构函数执行.对象不再是一个X.

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

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