在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 是派生類指針,則先調用派生類的析構函數,再調用基類的析構函數,調用順序與調用構造函數的順序相反。