首先我們看一段代碼:
class A{
public:
A(){ cout << "構造A " << endl; }
~A(){ cout << "析構A " << endl; }
};
class B:public A{
public:
B(){ cout << "構造B " << endl; }
~B(){ cout << "析構B " << endl; }
};
void test()
{
B b;
}
上面這就是很簡單的類B繼承類A,然后定義一個B的物件,
結果:

這個地方為什么先構造A,再構造B,但是先析構子類B,再析構父類A呢?
上面是簡單的情況,當父類中包含資料num,且被子類使用時,就知道為什么后構造先析構了,
此時若A中有資料num,B類的構造和析構都用到了這個資料num:
class A{
public:
A(){ cout << "構造A " << endl; }
~A(){ cout << "析構A " << endl; }
int num;
};
class B:public A{
public:
B(){ cout << num << endl; cout << "構造B " << endl; }
~B(){ cout << num << endl; cout << "析構B " << endl; }
};
- 此時B的建構式若想使用num這個資料,那么類A肯定就要提前構造出來,所以先構造A,再構造B;
- 反觀析構時,因為B要使用類A的資料,如果A先被析構了,那么B就無法呼叫這個資料,因此就需要先析構B再析構A,保證安全
同理,如果過類中包含其他類定義的物件,那么也是:
- 先構造父類,包含類,子類
- 先析構子類,包含類,父類
如下:
結果:

代碼:
#include<iostream>
using namespace std;
class C
{
public:
C(){ cout << "構造包含類C " << endl; }
~C(){ cout << "析構包含類C " << endl; }
};
class A{
public:
A(){ cout << "構造父類A " << endl; }
~A(){ cout << "析構父類A " << endl; }
};
class B:public A{
public:
B(){cout << "構造子類B " << endl; }
~B(){cout << "析構子類B " << endl; }
C c;
};
void test()
{
B b;
}
int main()
{
test();
system("pause");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/259523.html
標籤:其他
下一篇:服務認證授權:OAuth2.0
