Riordon

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

---恢复内容开始---

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

实例一

View Code
 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时,造成只释放了派生类对象中有关基类的那部分,而造成内存泄露。若用虚析构,见实例二

实例二

 

View Code
 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 时,就会释放全部派生类内存。还有什么时候用虚析构呢?见实例三

实例三

 

View Code
 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 }

 

运行结果如实例三

 

 

 

 

 

---恢复内容结束---

posted on 2013-04-09 22:25  Riordon  阅读(189)  评论(0)    收藏  举报