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


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

在Visual Studio中,新建控制台工程,構造類如下:

#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)

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)

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)

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)

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

運行結果:

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

總結:
由上面的實驗結果可以看出,當 new CDerive() 時,會先運行基類的構造函數,然后再運行派生類的構造函數;
而當 delete pointer 時,編譯器只考慮 pointer 指針本身的類型而不關心 pointer 實際指向的類型,即:若 pointer 為基類指針,則只調用基類的析構函數(不管 pointer 實際指向的是基類還是派生類);若 pointer 是派生類指針,則先調用派生類的析構函數,再調用基類的析構函數,調用順序與調用構造函數的順序相反。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM