C++中确定基类有虚析构函数


  有时,一个类想跟踪它有多少个对象存在。一个简单的方法是创建一个静态类成员来统计对象的个数。这个成员被初始化为0,在构造函数里加1,析构函数里减1。(条款m26里说明了如何把这种方法封装起来以便很容易地添加到任何类中,“my article on counting objects”提供了对这个技术的另外一些改进)
  设想在一个军事应用程序里,有一个表示敌人目标的类:
  class enemytarget {
  public:
  enemytarget() { ++numtargets; }
  enemytarget(const enemytarget&) { ++numtargets; }
  ~enemytarget() { --numtargets; }
  static size_t numberoftargets()
  { return numtargets; }
  virtual bool destroy();       // 摧毁enemytarget对象后
  // 返回成功
  private:
  static size_t numtargets;     // 对象计数器
  };
  // 类的静态成员要在类外定义;
  // 缺省初始化为0
  size_t enemytarget::numtargets;
  这个类不会为你赢得一份政府防御合同,它离国防部的要求相差太远了,但它足以满足我们这儿说明问题的需要。
  敌人的坦克是一种特殊的敌人目标,所以会很自然地想到将它抽象为一个以公有继承方式从enemytarget派生出来的类(参见条款35及m33)。因为不但要关心敌人目标的总数,也要关心敌人坦克的总数,所以和基类一样,在派生类里也采用了上面提到的同样的技巧:
  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();
  private:
  static size_t numtanks;         // 坦克对象计数器
  };
  (写完以上两个类的代码后,你就更能够理解条款m26对这个问题的通用解决方案了。)
  最后,假设程序的其他某处用new动态创建了一个enemytank对象,然后用delete删除掉:
  enemytarget *targetptr = new enemytank;
  ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值