C++學習筆記(6)----基類和派生類的構造函數和析構函數的執行順序

基類和派生類:構造函數和析構函數的執行順序

在Visual Studio中,新建控制檯工程,構造類以下:ios

#include<iostream>
using namespace std;

class CBase {
public:
    CBase() {
        cout << "CBase():Constructor" << endl;
    }
    ~CBase() {
        cout << "CBase(): Destructor" << endl;
    }
};

class CDerive :public CBase {
public:
    CDerive() {
        cout << "CDerive():Constructor" << endl;
    }
    ~CDerive() {
        cout << "CDerive(): Destructor" << endl;
    }
};

對應不一樣的指針進行 delete 操做,結果以下:函數

(i)spa

int main(int argc, char* argv[])
{
    CBase* p = new CDerive();
    delete p;
    return 0;
}

運行結果:指針

S:\ComputerTech\VS2015\Release>Test.exe
CBase():Constructor
CDerive():Constructor
CBase(): Destructor

(ii)code

int main(int argc, char* argv[])
{
    CDerive* pp = new CDerive();
    delete pp;
    return 0;
}

運行結果:編譯器

S:\ComputerTech\VS2015\Release>Test.exe
CBase():Constructor
CDerive():Constructor
CDerive(): Destructor
CBase(): Destructor

(iii)io

int main(int argc, char* argv[])
{
    CDerive* pp = new CDerive();
    CBase * p = (CBase*)pp;
    delete p;
    return 0;
}

運行結果:編譯

S:\ComputerTech\VS2015\Release>Test.exe
CBase():Constructor
CDerive():Constructor
CBase(): Destructor

(iv)class

int main(int argc, char* argv[])
{
    CBase * p = new CDerive();
    CDerive * pp = (CDerive*)p;
    delete pp;
    return 0;
}

運行結果:stream

S:\ComputerTech\VS2015\Release>Test.exe
CBase():Constructor
CDerive():Constructor
CDerive(): Destructor
CBase(): Destructor

總結: 由上面的實驗結果能夠看出,當 new CDerive() 時,會先運行基類的構造函數,而後再運行派生類的構造函數; 而當 delete pointer 時,編譯器只考慮 pointer 指針自己的類型而不關心 pointer 實際指向的類型,即:若 pointer 爲基類指針,則只調用基類的析構函數(無論 pointer 實際指向的是基類仍是派生類);若 pointer 是派生類指針,則先調用派生類的析構函數,再調用基類的析構函數,調用順序與調用構造函數的順序相反。

相關文章
相關標籤/搜索