【发布时间】:2017-07-09 21:45:19
【问题描述】:
我编写了以下类来测试多级继承概念。当我尝试测试对构造函数和析构函数的调用时,有一点我并没有真正理解。
#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;
}
输出
输出如下。我明白我们是从基类开始的。所以在Y y; 中,首先调用X 的构造函数,然后调用Y。在Z z; 中,首先调用X 的构造,然后调用Y,最后调用Z。
Construct X
construct Y
Construct X
construct Y
Construct Z
Destruct Z
Destruct Y
Destruct X
Destruct Y
Destruct X
问题
-
为什么没有在
Y y;之后立即调用 Y 的析构函数。为什么我们要等到 Z 构造好后再调用析构函数。意思是为什么输出看起来不像这样:Construct X construct Y Destruct Y Destruct X Construct X construct Y Construct Z Destruct Z Destruct Y Destruct X
【问题讨论】:
-
这意味着
y在z被构造之前被销毁。这是你所期望的吗?之后你会如何使用y? -
@HaniGotc:如果你想提前销毁一个变量,你需要将它包含在一个块中:
int main() { {Y y; } Z z; }。如果 'Y' 实际上是一个获取锁的类,并且您想提前释放锁,这将很有用。
标签: c++ constructor polymorphism destructor