effective c++:private继承

如果class间使用private继承关系,编译器就不会自动的将派生类转换为基类,而且private继承而来的成员都变为private属性。

private继承意味着根据某物实现出,当我们想要避免重复代码,使用现有的代码时,就可以使用private继承。

class Widget: private Timer {
 private:
    virtual void onTick() const; // look at Widget usage data, etc.
    ...
};

例如类widget需要使用到onTick函数,刚好发现Timer中以实现了这个函数,但Widget不是一个Timer,所以使用public 继承不合理,所以我们需要以private来继承Timer。但是这里的priavte继承有一些缺点,第一:当我们实现Widget的派生类的时候,可能我们还想阻止派生类重定义onTick函数,使用private继承则无法实现它。我们可以在Widget类内定义一个private class继承Timer,这样Widget的派生类就无法使用onTick函数,当然在c++11中已经有final关键字来阻止派生类对基类虚函数的重定义。

class Widget {
private:
  class WidgetTimer: public Timer {
  public:
  virtual void onTick() const;
  ...
};
WidgetTimer timer;
  ...
};

第二:当我们要将编译依存关系降低时,如果使用private继承,Widget编译时必须看到Timer的定义,即必须写上#include “Timer.h”.另一方面,如果 WidgetTimer 移出 Widget 而 Widget 只包含一个指向一个 WidgetTimer 的 pointer(指针),Widget 就可以只需要 WidgetTimer class(类)的一个简单的 declaration(声明);为了使用 Timer 它不需要 #include 任何东西。

private可以在多重继承中使用,当涉及"public 继承某个interface class" 和 “private继承某个协助实现的class”时

class IPerson { // this class specifies the
public: // interface to be implemented
  virtual ~IPerson();
  virtual std::string name() const = 0;
  virtual std::string birthDate() const = 0;
};
class DatabaseID { ... }; // used below; details are
// unimportant
class PersonInfo { // this class has functions
public: // useful in implementing
  explicit PersonInfo(DatabaseID pid); // the IPerson interface
  virtual ~PersonInfo();
  virtual const char * theName() const;
  virtual const char * theBirthDate() const;
  ...
private:
  virtual const char * valueDelimOpen() const;
  virtual const char * valueDelimClose() const;
  ...
};
class CPerson: public IPerson, private PersonInfo { // note use of MI
public:
  explicit CPerson(DatabaseID pid): PersonInfo(pid) {}
  virtual std::string name() const // implementations
  { return PersonInfo::theName(); } // of the required
  // IPerson member
  virtual std::string birthDate() const // functions
  {  return PersonInfo::theBirthDate(); }
private: // redefinitions of
  const char * valueDelimOpen() const { return ""; } // inherited virtual
  const char * valueDelimClose() const { return ""; } // delimiter
};
原文地址:https://www.cnblogs.com/loujiayu/p/3687437.html