more effective c++26款有些代码不懂

more effective c++26款有点代码不懂
这是基类:
emplate<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;
}



这是派生类:
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);
};



问题:基类的init()函数是私有的,他的继承却是私有继承。
那派生类应该不会有init函数才对呀!派生了后计数功能在哪?

作者说:一旦Printer继承自Counted<Printer>,便可以完全忘记“对象计数”这回事,Printer自己完全不必操心,就好像有人专门为他服务时的。

我不理解,基类Counter类虽然在private Counter<Printer>这段中,用模板把派生Printer的构造,复制函数定义了。
但它还是个类呀,init是私有函数,就不该被继承呀?可是作者又说它有完全的计数功能。

我流程哪里走错了?我理解错误码?求解答!
------解决方案--------------------
可能你不理解构造的过程,子类构造的时候一定会先调用基类的构造函数,所以每次Printer构造numObjects都会+1。
这样子类当然不用调用init,所以根本不用操心计数器了。
也可以用继承的概念来理解,子类和基类是“is a”的关系。所以printer也是一个Counted,它应该包含Counted的行为,比如构造时计数的行为。
------解决方案--------------------
你对继续没有理解清楚,继承后,父类所有的东西子类都有。只是因为不同的继续权限决定子类能不能直接调用父类的东西而已,注意是不能直接调用,间接调用还是可以的。父类的构造函数和析构造函数子类都能直接调用,而且是默认加入到子类的构造和析构造函数里面,而init又在父类的构造函数里面,相当于间接被调用了。所以只要继续了父类,你就无需再考虑计数问题,一切都由编译器帮你做好。
------解决方案--------------------
私有继承也是继承,所有的代码都发挥作用,所以你说的“init是私有函数,就不该被继承呀”是不对的,所有的部分都会被继承。但是基类的所有成员或函数都不能由子类直接调用,但是他们会默默地发挥作用。

例如:子类调用父类的普通函数A(),不可以,因为是私有继承

而子类构造时,父类会自动构造,这时候是可以调用的,但不需要写代码来调用,是自动的。父类调用了构造函数,构造函数中又调用了其他函数,是完全可以的。

作者说:一旦Printer继承自Counted<Printer>,便可以完全忘记“对象计数”这回事,Printer自己完全不必操心,就好像有人专门为他服务时的。

这个意思就是说你只管继承自Counted<Printer>,你构造,那么Counted<Printer>就会构造,就会自动管理计数,你自己的类不需要任何特殊处理。
------解决方案--------------------
确实楼主没理解清楚继承的关系. 
我记得我们大学的时候, 老师竟然跟我们说,  基类的私有成员有没有被继承一直存在争议.

我现在只想fuck它.

基类的东西, 派生类是肯定有的, 只是私有的不能直接访问, 可以理解为被隐藏起来了. 但不能说它不存在了.