【问题标题】:Reason reqd for the order of destructor call .?析构函数调用顺序的原因 reqd .?
【发布时间】:2010-08-31 18:09:56
【问题描述】:

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

既然派生类对象超出了作用域,为什么要先调用派生类析构函数。在基类析构函数之后不能调用派生类析构函数的编译器的约束是什么?

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

【问题讨论】:

    标签: c++ destructor


    【解决方案1】:

    当派生类对象被创建时,一个特定的基类对象(实际上是子对象)。即,当您创建派生对象时,基类 ctor 用于在派生对象中初始化基类 subj-object,并且只有在完成之后,派生类 ctor 才开始做它的事情,初始化添加到派生类等

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        看看在删除Z 类型的对象时如果析构函数是从最派生到基类调用时会发生什么:

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

        • 然后Y 析构函数执行。这 对象不再是 Y 并恢复 成为一个X

        • 然后X 析构函数执行。这 对象不再是X,而是现在 什么都没有(完全 销毁)。

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

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

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

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

        【讨论】:

          【解决方案4】:

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

          我现在用 std::map 类型的成员重新测试了 这似乎不是真的。 对不起。

          【讨论】:

            猜你喜欢
            • 2021-08-03
            • 2018-05-08
            • 2013-06-24
            • 2012-05-22
            • 1970-01-01
            • 2011-01-16
            • 2011-11-24
            • 2013-04-14
            相关资源
            最近更新 更多