C++中确定基类有虚析构函数
有时,一个类想要跟踪它有多少个对象。一个简单的方法是创建一个静态类成员来计算对象的数量。该成员初始化为0,构造函数加1,析构函数减1。(第m26条解释了如何封装这个方法,以便可以很容易地将它添加到任何类中,并且“我的关于计数对象的文章”提供了这项技术的一些其他改进)
想象一下,在一个军事应用程序中,有一个表示敌方目标的类:
class enemy target {
public:
enemy target(){ ++ num targets;}
enemy target(const enemy target &){ ++ num targets;}
~ enemy target(){-num targets;}
static size _ t number of targets()
{ return num targets;}
虚拟bool destroy();//销毁enemytarget对象
//返回成功。
private:
static size _ t numtargets;//对象计数器
};
//类的静态成员应该在类外部定义;
//默认初始化为0
size _ tenemy target::num targets;
这个班不会给你赢得政府国防合同。和国防部的要求差的很远,但是足以满足我们这里讲解的需要。
敌人的坦克是一种特殊的enemytarget,所以很自然的会把它抽象成一个通过公共继承从enemytarget派生出来的类(见35条款和m33)。因为我们不仅要关心敌人目标的总数,还要关心敌人坦克的总数,所以和基类一样,在派生类中也采用了上面提到的同样的技术:
class enemy tank:public enemy target {
public:
enemy tank(){ ++ numtanks;}
enemy tank(const enemy tank & RHS)
:enemy target(RHS)
{ ++ numtanks;}
~ enemy tank(){-numtanks;}
static size _ t numoftanks()
{ return numtanks;}
虚拟bool destroy();
private:
static size _ t numtanks;//坦克对象计数器
};
(写完上面两个类的代码,你就可以更好的理解m26条款对这个问题的一般解决方案了。)
最后,假设程序中的某个地方用new动态创建了一个enemytank对象,然后用delete删除它:
enemy target * target ptr = new enemy tank;
...
删除targetptr
位律师回复
0条评论