打印本文 关闭窗口 |
|
| C++中确定基类有虚析构函数 | |
| 作者:佚名 文章来源:不详 点击数 更新时间:2008/1/9 11:02:16 文章录入:杜斌 责任编辑:杜斌 | |
|
|
|
|
设想在一个军事应用程序里,有一个表示敌人目标的类: 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; |
|
打印本文 关闭窗口 |