在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 是派生类指针,则先调用派生类的析构函数,再调用基类的析构函数,调用顺序与调用构造函数的顺序相反。