论坛首页 编程语言技术论坛

条款14: 确定基类有虚析构函数

浏览 1848 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-02-02  
C++
条款14: 确定基类有虚析构函数
对于这个问题来说,我想直接举这个例子就比较好解释了。
class enemytarget {
public:
	enemytarget() { ++numtargets; }
	enemytarget(const enemytarget&) { ++numtargets; }
	~enemytarget() { --numtargets; }

	static size_t numberoftargets()
	{ return numtargets; }

	virtual bool destroy(){return 0;};       // 摧毁enemytarget对象后
	// 返回成功

private:
	static size_t numtargets;     // 对象计数器
};

size_t enemytarget::numtargets=0;

class enemytank: public enemytarget {
public:
	enemytank() { ++numtanks; }

	enemytank(const enemytank& rhs)
		: enemytarget(rhs)          //基类构造函数
	{ ++numtanks; }

	~enemytank() { --numtanks; }

	static size_t numberoftanks()
	{ return numtanks; }

	virtual bool destroy(){return 0;};

private:
	static size_t numtanks;         // 坦克对象计数器
};

size_t enemytank::numtanks=0;

int main()
{
	enemytarget *targetptr = new enemytank;
	cout<<"targetptr: "<<targetptr->numberoftargets()<<endl;
	cout<<"targetptr: "<<enemytank::numberoftanks()<<endl;
    delete targetptr;
	cout<<"targetptr: "<<targetptr->numberoftargets()<<endl;
	cout<<"targetptr: "<<enemytank::numberoftanks()<<endl;

	return 0;
}

结果:
targetptr: 1
targetptr: 1
targetptr: 0             //只调用基类的析构函数
targetptr: 1
Press any key to continue



看吧,DELETE时,派生类中的坦克数量没被释放。解决的方法很简单,把基类的析构函数设为虚函数。那么语意就变为,让派

生类去定制自己的行为。所以说在定制基类时,对其的析构函数都要指定虚函数。
那么是否要对每个基类都申请虚拟函数呢?
    申明一个虚拟函数花费的代价是产生一个32位的指针,这是否会让它变得不可移植了呢?
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics