天天看點

條款:07 為多态基類聲明virtual析構函數

Effective C++中說過:

1、帶有多态性質的base class應該聲明一個virtual析構函數。如果class帶有任何virtual函數,它就應該擁有一個virtual析構函數;

2、Classes的設計目的如果不是作為base class使用, 或者不是為了具有多态性質,就不該聲明virtual 析構函數。

#ifndef __EFFECTIVE_H__
#define __EFFECTIVE_H__

/*include*/
#include <iostream>

using namespace :: std;

class baseClass 
{
public :
	baseClass()
	{
		cout << "base Class construction function" << endl;
	}

	~baseClass()
	{
		cout << "base Class destruction function" << endl;
	}
};

class derivedClass : public baseClass
{
public :
	derivedClass()
	{
		cout << "derived Class construction function" << endl;
	}

	~derivedClass()
	{
		cout << "derived Class destruction function" << endl;
	}

};


#endif /*__EFFECTIVE_H__*/
           

baseClass是derivedClass類的基類, 同時baseClass的析構函數沒有定義為virtual。

int _tmain(int argc, _TCHAR* argv[])
{
	derivedClass *pDerivedClass = new derivedClass();
	baseClass *pBaseClass = pDerivedClass;
	delete pBaseClass;
	return 0;
}
           

運作結果如下:

條款:07 為多态基類聲明virtual析構函數

說明:在delete pBaseClass指針時,并沒有調用derivedClass派生類的析構函數。

當derived class對象經由一個base class指針被删除,而該base class帶着一個non-virtual析構函數, 實際執行時,對象的derived成分沒有被銷毀,會造成資源洩露、資料敗壞等現象。

修複方式很簡單:

virtual ~baseClass()
	{
		cout << "base Class destruction function" << endl;
	}
           

隻需要将基類baseClass的析構函數帶上一個virtual。

運作結果如下:

條款:07 為多态基類聲明virtual析構函數

繼續閱讀