条款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位的指针,这是否会让它变得不可移植了呢?
分享到:
相关推荐
条款14: 确定基类有虚析构函数 条款15: 让operator=返回*this的引用 条款16: 在operator=中对所有数据成员赋值 条款17: 在operator=中检查给自己赋值的情况 第四章 类和函数:设计与声明条款 条款18: 争取使类的接口...
**条款14:确定基类有虚析构函数** - **目的**: 确保派生类对象被正确销毁。 - **解释**: 如果一个类作为基类被继承,则应该将其析构函数声明为虚函数。这样,即使通过基类指针删除派生类对象,也可以正确调用派生...
本笔记总结了Effective C++的第1到第11条款,涵盖了C++语言的多个方面,包括构造函数、拷贝构造函数、拷贝赋值函数、const关键字、enum、inline函数、定义域、static变量、初始化、编译器生成的函数、拷贝控制、多态...
**条款14:确定基类有虚析构函数** - **背景**:当一个类作为其他类的基类时,应确保其析构函数为虚函数。 - **原因**:如果没有虚析构函数,通过基类指针删除派生类对象时会导致资源泄露。 - **示例**: ```cpp ...
条款07:为多态基类声明Virtual析构函数 条款08:别让异常逃离析构函数 条款09:绝不在构造和析构过程中调用Virtual函数 条款10:令Operator=返回一个referenceto this 条款11:在Operator=中处理“自我赋值” ...
**条款 07:为多态基类声明 virtual 析构函数** 当基类需要支持多态时,声明`virtual`析构函数是必要的。这样,通过基类指针或引用删除派生类对象时,将正确调用派生类的析构函数,避免资源泄露。 **条款 08:别让...
条款07:为多态基类声明virtual析构函数 declare destructors virtual in polymorphic base classes. 条款08:别让异常逃离析构函数 prevent exceptions from leaving destructors. 条款09:绝不在构造和析构过程中...
8. 条款7:为多态基类声明virtual析构函数 - 如果一个类用于多态,并且有派生类,则应该声明virtual析构函数以确保派生类的析构函数能够被调用。 9. 条款8:别让异常逃离析构函数 - 析构函数中应避免抛出异常,...
11. **确定基类有虚析构函数**: 如果基类可能会被多态地删除,那么它应该有一个虚析构函数,以确保正确调用派生类的析构函数。 12. **让operator=返回*this的引用**: 这样的设计允许链式赋值,例如`a = b = c;`...
7. **为多态基类声明virtual析构函数**:当基类需要被多态继承时,虚拟析构函数确保子类对象能正确地销毁。 8. **别让异常逃离析构函数**:析构函数应当处理可能抛出的异常,因为异常在析构函数中无法被捕获,可能...
- **条款07**:强调了多态基类中声明虚拟析构函数的重要性,以确保派生类的析构函数能够被正确调用。 - **条款08至10**:讨论了异常处理与构造/析构过程的关系,以及如何正确实现赋值运算符以处理自我赋值和深拷贝...