|
C++中确定基类有虚析构函数 |
|
|
|
www.nanhushi.com 佚名 不详 |
|
有时,一个类想跟踪它有多少个对象存在。一个简单的方法是创建一个静态类成员来统计对象的个数。这个成员被初始化为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;
...
delete targetptr;
|
|
|
|
| 文章录入:杜斌 责任编辑:杜斌 |
|
上一篇文章: 改观从点滴开始新版远程桌面细节 下一篇文章: 一般线性链表类的C++实现 |
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
| |
|