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

};

你可能感兴趣的:(effective)