《More Effective C++》条款26里的这几句话该如何理解?

时间:2022-06-09 03:59:38
有两个类是这样的:
//一个用于对象计数的基类:
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什么都继承不下来  我记得书上是说 这个只是代表基类和派生类有一层关系 在派生类中并没有实际意义

#4


因为private的意思是相当于“使用这个类”,而不是“继承”,
public继承,就有把基类当作接口的意思,而private显然就没有这个功能,只是提供方法。

#5


引用 3 楼 superbtl 的回复:
trait?
private什么都继承不下来  我记得书上是说 这个只是代表基类和派生类有一层关系 在派生类中并没有实际意义


private继承应该是基类里的public和protected成员在继承类里变成private成员吧...

#6


在《effective C++》条款39有这样一句话:如果classes之间的继承关系是private,编译器不会自动将一个derived class 对象转换为一个base class 对象。这和public继承的情况不同。

以前看过的,居然忘了...汗...

#1


sf

#2


你能不能编译试试啊。

#3


trait?
private什么都继承不下来  我记得书上是说 这个只是代表基类和派生类有一层关系 在派生类中并没有实际意义

#4


因为private的意思是相当于“使用这个类”,而不是“继承”,
public继承,就有把基类当作接口的意思,而private显然就没有这个功能,只是提供方法。

#5


引用 3 楼 superbtl 的回复:
trait?
private什么都继承不下来  我记得书上是说 这个只是代表基类和派生类有一层关系 在派生类中并没有实际意义


private继承应该是基类里的public和protected成员在继承类里变成private成员吧...

#6


在《effective C++》条款39有这样一句话:如果classes之间的继承关系是private,编译器不会自动将一个derived class 对象转换为一个base class 对象。这和public继承的情况不同。

以前看过的,居然忘了...汗...