一个关于私有(实现)继承的疑问,由《MEC》i.26想到的
《More Effective C++》第26条款实现了一个可以用来给对象计数的基类,以防止由一个类构造了超过用户设想范围的对象。有点类似于COM技术。下面是基类的定义,实现代码就不贴了,太长。
template<class BeingCounted>
class Counted
{
public:
class TooManyObjects{}; //这是个异常,当构造超过限定的对象时触发
static int objectCount() { return numObjects; } // 返回当前已构造的对象数量
Protected:
Counted(); // 构造和下面的拷贝构造的代码就是判断是否超限,如果超限就抛出上面的异常
Counted(const Counted& rhs);
private:
static int numObjects;
static const size_t maxObjects;
};
现在有一个只能同时存在有限个数对象的派生类
class Printer: private Counted<Printer>
{
public:
static Printer * makePrinter(); // 获得一个Printer指针
~Printer();
……
private:
Printer();
Printer( const Printer& rhs );
};
“……另一种做法是在 Printer 和 Counted<Printer> 之间使用公有继承,但是这么一来我们就不得不给予 Couted 类一个虚析构(否则我们就得冒险:如果有人通过 Counted<Printer>* 指针删除了一个Printer对象,会有不正确的行为)……”
上面是书上的原话,我有两点疑问。
一,Counted<Printer> 的析构是私有,那又怎么可能通过 Counted<Printer>* 的指针来删除Printer对象?将一个 Counted<Printer>* 的指针应用到 delete 操作符上应该是不合法的语句啊?
二,为何不为 Printer 实现一个 Destroy 函数来实现内存的释放,并将~Printer声明为私有?如果像上面这样子写那么下面的写法不是很难受?
Printer *prt = Printer::makePrinter();
……
delete prt;
要知道,程序员一般最害怕出现不成对的 new 和 delete 了。
请各位为我答疑,感谢。