//一个用于对象计数的基类:
template<class BeingCounted>
class Counted {
public:
class TooManyObjects{}; // 用来抛出异常
static int objectCount() { return numObjects; }
protected:
Counted();
Counted(const Counted& rhs);
~Counted() { --numObjects; }
private:
static int numObjects;
static const size_t maxObjects;
void init(); // 避免构造函数的
}; // 代码重复
template<class BeingCounted>
Counted<BeingCounted>::Counted()
{ init(); }
template<class BeingCounted>
Counted<BeingCounted>::Counted(const Counted<BeingCounted>&)
{ init(); }
template<class BeingCounted>
void Counted<BeingCounted>::init()
{
if (numObjects >= maxObjects) throw TooManyObjects();
++numObjects;
}
//现在能使用Counted模板修改Printer类:
class Printer: private Counted<Printer> {
public:
// 伪构造函数
static Printer * makePrinter();
static Printer * makePrinter(const Printer& rhs);
~Printer();
void submitJob(const PrintJob& job);
void reset();
void performSelfTest();
...
using Counted<Printer>::objectCount;
using Counted<Printer>::TooManyObjects;
private:
Printer();
Printer(const Printer& rhs);
};
然后下面有这样的几句话:如果以公有继承的方式让|Printer继承自Counted<Printer>,我们必须要给Counted类一个虚析构函数(否则的话,如果有人通过Counted<Printer>* 指针来删除一个Printer对象,就有可能导致不正确的行为).
条款24清楚地表明,如果Counted类含有虚函数几乎肯定会影响到那些由Counted继承而来的类的对象的大小和布局.我们
不想要这些额外的负担,使用私有继承可以让我们避开它们.
我想问的是:为什么在这里使用私有继承就可以不用虚析构函数?
6 个解决方案
#1
sf
#2
你能不能编译试试啊。
#3
trait?
private什么都继承不下来 我记得书上是说 这个只是代表基类和派生类有一层关系 在派生类中并没有实际意义
private什么都继承不下来 我记得书上是说 这个只是代表基类和派生类有一层关系 在派生类中并没有实际意义
#4
因为private的意思是相当于“使用这个类”,而不是“继承”,
public继承,就有把基类当作接口的意思,而private显然就没有这个功能,只是提供方法。
public继承,就有把基类当作接口的意思,而private显然就没有这个功能,只是提供方法。
#5
private继承应该是基类里的public和protected成员在继承类里变成private成员吧...
#6
在《effective C++》条款39有这样一句话:如果classes之间的继承关系是private,编译器不会自动将一个derived class 对象转换为一个base class 对象。这和public继承的情况不同。
以前看过的,居然忘了...汗...
以前看过的,居然忘了...汗...
#1
sf
#2
你能不能编译试试啊。
#3
trait?
private什么都继承不下来 我记得书上是说 这个只是代表基类和派生类有一层关系 在派生类中并没有实际意义
private什么都继承不下来 我记得书上是说 这个只是代表基类和派生类有一层关系 在派生类中并没有实际意义
#4
因为private的意思是相当于“使用这个类”,而不是“继承”,
public继承,就有把基类当作接口的意思,而private显然就没有这个功能,只是提供方法。
public继承,就有把基类当作接口的意思,而private显然就没有这个功能,只是提供方法。
#5
private继承应该是基类里的public和protected成员在继承类里变成private成员吧...
#6
在《effective C++》条款39有这样一句话:如果classes之间的继承关系是private,编译器不会自动将一个derived class 对象转换为一个base class 对象。这和public继承的情况不同。
以前看过的,居然忘了...汗...
以前看过的,居然忘了...汗...