在多级继承中调用析构函数(c ++)

Han*_*otc 3 c++ polymorphism constructor destructor

我编写了以下类来测试多级继承概念.当我试图测试对构造函数和析构函数的调用时,有一点我真的不明白.


#include <iostream>

using namespace std;

class X{

    public:
        X(){cout <<"Construct X " << endl;};
        virtual ~X(){cout <<"Destruct X " << endl;};
        virtual void print() const = 0;
};

class Y: public X{
    public:
        Y(){cout <<"construct Y " << endl;};
        ~Y(){cout <<"Destruct Y " << endl;};
        void print() const{
            cout <<"print Y" << endl;
        };
};

class Z: public Y{
    public:
        Z(){cout <<"Construct Z" << endl; };
        ~Z(){cout <<"Destruct Z " << endl; };
        void print() const{
            cout <<" Print Z" << endl;
        };
};

int main()
{
    Y y;
    //Why isn't Y being destructed in here
    Z z;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产量

输出如下.我明白我们从基类开始.因此,在Y y;第一个X的构造函数被调用,那么ÿ.在Z z;第一个X的结构被调用,那么ÿ终于ž.

Construct X
construct Y
Construct X
construct Y
Construct Z
Destruct Z
Destruct Y
Destruct X
Destruct Y
Destruct X
Run Code Online (Sandbox Code Playgroud)

  • 为什么Y之后的析构函数不会被调用Y y;.我们为什么要等到Z构建然后调用析构函数.意思是为什么输出看起来不像那样:

    Construct X
    construct Y
    Destruct Y
    Destruct X
    Construct X
    construct Y
    Construct Z
    Destruct Z
    Destruct Y
    Destruct X
    
    Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 8

继承在这里是一个红鲱鱼.这不相关.

y并且z具有自动存储持续时间并且在这种情况下需要保持在范围内直到功能的闭合支撑.

并且以前z会被毁坏.(自动变量按照创建它们的相反顺序超出范围,所有其他条件相同.) y