虛解構函式的作用

sunmenggmail發表於2012-04-26

轉自:http://hi.csdn.net/doer_ljy

如果一個基類的解構函式被說明為虛解構函式,則它的派生類中的解構函式也是虛解構函式,不管它是否使用了關鍵字virtual進行說明。 


        說明虛解構函式的目的在於在使用delete運算子刪除一個物件時,能保解構函式被正確地執行。因為設定虛解構函式後,可以採用動態聯編方式選擇解構函式。 

        下面舉一個用虛解構函式的例子。 

        #include   <iostream.h> 

        class   A 
        { 
        public: 
        virtual   ~A()   {   cout < < "A::~A()   Called.\n ";   } 
        }; 

        class   B   :   public   A 
        { 
        public: 
        B(int   i)   {   buf   =   new   char[i];   } 
        virtual   ~B() 
        { 
                delete   []   buf; 
                cout < < "B::~B()   Called.\n "; 
        } 
        private: 
        char   *   buf; 
        }; 

        void   fun(A   *a) 
        { 
        delete   a; 
        } 

        void   main() 
        { 
        A   *a   =   new   B(15); 
        fun(a); 
        } 

        執行該程式輸出如下結果: 

        B::~B()   Called. 
        A::~A()   Called. 

        如果類A中的解構函式不用虛擬函式,則輸出結果如下: 

        A::~A()   Called. 

        當說明基類的解構函式是虛擬函式時,呼叫fun(a)函式,執行下述語句: 

        delete   a; 

        由於執行delete語句時自動呼叫解構函式,採用動態聯編,呼叫它基類的解構函式,所以輸出上述結果。 

        當不說明基類的解構函式為虛擬函式時,delete隱含著對解構函式的呼叫,故產生 

        A::~A()   Called. 

        的結果。


class   A 
{ 
public: 
	virtual   ~A()   {   cout << "A::~A()   Called.\n ";   } 
}; 

class   B   :   public   A 
{ 
public: 
	B(int   i)   {   buf   =   new   char[i];   } 
	 ~B() 
	{ 
		delete   []   buf; 
		cout <<"B::~B()   Called.\n "; 
	} 
private: 
	char   *   buf; 
}; 
class C:public B
{
public:
	C(int i):B(i){}//派生類向基類傳值
	~C()
	{
		cout<<"C::~C() called\n";
	}
};

只要基類宣告瞭虛解構函式,則它所有的派生類均不用再將解構函式宣告為虛的

思考下下面兩段程式碼的輸出:

程式碼1:

B   *a   =   new   C(7);
delete a;


程式碼2:

A   *a   =   new   C(7);
delete a;


兩段程式碼均輸出:

C::~C() called
B::~B()   Called.
A::~A()   Called.

相關文章