`

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

阅读更多
条款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位的指针,这是否会让它变得不可移植了呢?
0
0
分享到:
评论

相关推荐

    Effective.C++.中文第二版.50条款doc文档.chm

    条款14: 确定基类有虚析构函数 条款15: 让operator=返回*this的引用 条款16: 在operator=中对所有数据成员赋值 条款17: 在operator=中检查给自己赋值的情况 第四章 类和函数:设计与声明条款 条款18: 争取使类的接口...

    Effective_C++

    **条款14:确定基类有虚析构函数** - **目的**: 确保派生类对象被正确销毁。 - **解释**: 如果一个类作为基类被继承,则应该将其析构函数声明为虚函数。这样,即使通过基类指针删除派生类对象,也可以正确调用派生...

    effective c++笔记1

    本笔记总结了Effective C++的第1到第11条款,涵盖了C++语言的多个方面,包括构造函数、拷贝构造函数、拷贝赋值函数、const关键字、enum、inline函数、定义域、static变量、初始化、编译器生成的函数、拷贝控制、多态...

    高效C++:从C到C++

    **条款14:确定基类有虚析构函数** - **背景**:当一个类作为其他类的基类时,应确保其析构函数为虚函数。 - **原因**:如果没有虚析构函数,通过基类指针删除派生类对象时会导致资源泄露。 - **示例**: ```cpp ...

    Effective C++ 中文版

    条款07:为多态基类声明Virtual析构函数 条款08:别让异常逃离析构函数 条款09:绝不在构造和析构过程中调用Virtual函数 条款10:令Operator=返回一个referenceto this 条款11:在Operator=中处理“自我赋值” ...

    EffectiveC++终稿44__tagged_2019-06241

    **条款 07:为多态基类声明 virtual 析构函数** 当基类需要支持多态时,声明`virtual`析构函数是必要的。这样,通过基类指针或引用删除派生类对象时,将正确调用派生类的析构函数,避免资源泄露。 **条款 08:别让...

    Effective C++(第三版)

    条款07:为多态基类声明virtual析构函数 declare destructors virtual in polymorphic base classes. 条款08:别让异常逃离析构函数 prevent exceptions from leaving destructors. 条款09:绝不在构造和析构过程中...

    Effective C++中文第三版

    8. 条款7:为多态基类声明virtual析构函数 - 如果一个类用于多态,并且有派生类,则应该声明virtual析构函数以确保派生类的析构函数能够被调用。 9. 条款8:别让异常逃离析构函数 - 析构函数中应避免抛出异常,...

    Effective C++

    11. **确定基类有虚析构函数**: 如果基类可能会被多态地删除,那么它应该有一个虚析构函数,以确保正确调用派生类的析构函数。 12. **让operator=返回*this的引用**: 这样的设计允许链式赋值,例如`a = b = c;`...

    Effective C++学习笔记

    7. **为多态基类声明virtual析构函数**:当基类需要被多态继承时,虚拟析构函数确保子类对象能正确地销毁。 8. **别让异常逃离析构函数**:析构函数应当处理可能抛出的异常,因为异常在析构函数中无法被捕获,可能...

    Effective_C++_3rd笔记.pdf

    - **条款07**:强调了多态基类中声明虚拟析构函数的重要性,以确保派生类的析构函数能够被正确调用。 - **条款08至10**:讨论了异常处理与构造/析构过程的关系,以及如何正确实现赋值运算符以处理自我赋值和深拷贝...

Global site tag (gtag.js) - Google Analytics