---恢复内容开始---
//********************************************************//
//------------------什么时候使用虚析构--------------------//
//有两种情况下需使用虚析构函数:(注:构造与析构都不能被继承)
// 1、当用基类指针pBase去new一个派生类对象,delete pBase时
// 2、当类中有一个虚成员函数时,而用基类去调用派生类成员时
//*******************************************************//
实例一

1 #include <iostream> 2 using namespace std; 3 4 class CBase 5 { 6 public: 7 CBase() 8 { 9 cout<<"CBase:CBase()"<<endl; 10 } 11 12 ~CBase() 13 { 14 cout<<"CBase:~CBase()"<<endl; 15 } 16 17 void Dosomethings() 18 { 19 cout<<"CBase::Dosomethings()"<<endl; 20 } 21 }; 22 23 class CDerived : public CBase 24 { 25 public: 26 CDerived() 27 { 28 cout<<"CDerived:CDerived()"<<endl; 29 } 30 31 ~CDerived() 32 { 33 cout<<"CDerived:~CDerived()"<<endl; 34 } 35 36 void Dosomethings() 37 { 38 cout<<"CDerived::Dosomethings()"<<endl; 39 } 40 }; 41 42 43 int main(int argc, char* argv[]) 44 { 45 CBase *pBase = new CDerived; 46 47 pBase->Dosomethings(); 48 49 delete pBase; 50 51 return 0; 52 }
运行行结果:
CBase::CBase()
CDerived::CDerived()
CBase::Dosomethings()
CBase::~CBase()
当用基类指针pBase new 派生类对象内存,再用delete pBase时,造成只释放了派生类对象中有关基类的那部分,而造成内存泄露。若用虚析构,见实例二
实例二

1 #include <iostream> 2 using namespace std; 3 4 class CBase 5 { 6 public: 7 CBase() 8 { 9 cout<<"CBase:CBase()"<<endl; 10 } 11 12 virtual ~CBase() 13 { 14 cout<<"CBase:~CBase()"<<endl; 15 } 16 17 void Dosomethings() 18 { 19 cout<<"CBase::Dosomethings()"<<endl; 20 } 21 }; 22 23 class CDerived : public CBase 24 { 25 public: 26 CDerived() 27 { 28 cout<<"CDerived:CDerived()"<<endl; 29 } 30 31 virtual~CDerived() 32 { 33 cout<<"CDerived:~CDerived()"<<endl; 34 } 35 36 void Dosomethings() 37 { 38 cout<<"CDerived::Dosomethings()"<<endl; 39 } 40 }; 41 42 43 int main(int argc, char* argv[]) 44 { 45 CBase *pBase = new CDerived; 46 47 pBase->Dosomethings(); 48 49 delete pBase; 50 51 return 0; 52 }
运行结果:
CBase::CBase()
CDerived::CDerived()
CBase::Dosomethings()
CDerived::~CDerived()
CBase::~CBase()
这样,当delete pBase 时,就会释放全部派生类内存。还有什么时候用虚析构呢?见实例三
实例三

1 #include <iostream> 2 using namespace std; 3 4 class CBase 5 { 6 public: 7 CBase() 8 { 9 cout<<"CBase:CBase()"<<endl; 10 } 11 12 virtual ~CBase() 13 { 14 cout<<"CBase:~CBase()"<<endl; 15 } 16 17 virtual void Dosomethings() 18 { 19 cout<<"CBase::Dosomethings()"<<endl; 20 } 21 }; 22 23 class CDerived : public CBase 24 { 25 public: 26 CDerived() 27 { 28 cout<<"CDerived:CDerived()"<<endl; 29 } 30 31 virtual~CDerived() 32 { 33 cout<<"CDerived:~CDerived()"<<endl; 34 } 35 36 void Dosomethings() 37 { 38 cout<<"CDerived::Dosomethings()"<<endl; 39 } 40 }; 41 42 43 int main(int argc, char* argv[]) 44 { 45 CBase *pBase = new CDerived; 46 47 pBase->Dosomethings(); 48 49 delete pBase; 50 51 return 0; 52 }
运行结果如实例三
---恢复内容结束---
我喜欢一无所有,这样就只能一步一步的创造世界...