如果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 = ;
  virtual std::string birthDate() const = ;
};
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 c++:private继承的更多相关文章

  1. Effective C++ -----条款39:明智而审慎地使用private继承

    Private继承意味is-implemented-in-terms of(根据某物实现出).它通常比复合(composition)的级别低.但是当derived class需要访问protected ...

  2. 读书笔记 effective c++ Item 39 明智而谨慎的使用private继承

    1. private 继承介绍 Item 32表明C++把public继承当作”is-a”关系来对待.考虑一个继承体系,一个类Student public 继承自类Person,如果一个函数的成功调用 ...

  3. Effective C++:条款39:明智而审慎地使用private继承

    (一) (1)private继承意味着"依据某物实现出".仅仅有实现部分被继承.接口部分应略去: (2)它仅仅在软件"实现"层面上有意义,在软件"设计 ...

  4. Effective C++ 6.继承与面向对象设计

    //条款32:确定你的public继承塑模出is-a关系 // 1.public继承意味着is-a的关系,适用在基类上的方法都能用于派生类上. //条款33:避免遮掩继承而来的名称 // 1.在pub ...

  5. private继承

    private继承并不如public继承一样具有is-a的关系. ------------------------------------------------------------------- ...

  6. 【39】明智而审慎第使用private继承

    1.private继承意味着,根据某物实现出,继承父类的实现,关闭父类的接口,并不是Is-A的关系,不满足里氏代换,继承的内容访问权限都修改为private. 2.那么问题来了,复合也表达根据某物实现 ...

  7. C++:private继承与public继承

    1 private, public, protected 访问标号的访问范围 private:只能由1.该类中的函数.2.其友元函数访问. 不能被任何其他访问,该类的对象也不能访问. protecte ...

  8. 《Effective C++》继承与面对对象设计:条款32-条款40

    条款32:确定你的public继承塑模出is-a关系 public继承意味着is-a.适用于base class身上的每一个函数也一定适用于derived class. 条款33:避免遮掩继承而来的名 ...

  9. 读书笔记_Effective_C++_条款三十九:明智而审慎地使用private继承

    private继承的意义在于“be implemented in turns of”,这个与上一条款中说的复合模型的第二层含义是相同的,这也意味着通常我们可以在这两种设计方法之间转换,但书上还是更提倡 ...

随机推荐

  1. C# winFrom 制作、打包、签名、发布Activex全过程

    注:转自园中 http://www.cnblogs.com/still-windows7/p/3148623.html 一.前言 最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信.调 ...

  2. BZOJ 2351 Matrix(哈希)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2351 题意:给出一个n*m的01矩阵.再给出10个A*B的小01矩阵.判断这些小的矩阵是 ...

  3. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  4. ERROR 1442 (HY000):because it is already used by statement which invoked this stored function/tr

    看到mysql的触发器,随手写了一个: mysql> create trigger t_ai_test -> after insert on test -> for each row ...

  5. jQuery_添加与删除元素

    一.jQuery添加元素(通过 jQuery,可以很容易地添加新元素/内容.) 1.添加新的 HTML 内容,用于添加新内容的四个 jQuery 方法(都能解析HTML标签): append() - ...

  6. highCharts入门-强大的图表库插件

    简介         Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业 ...

  7. 关于NSString的retainCount的各种结果原因

    转载:http://blog.csdn.net/onlyou930/article/details/6932529 http://www.cnblogs.com/celestial/archive/2 ...

  8. Linux 查找文件方法

    1) find -name httpd.conf 2) find /etc -name "*repo" 详情查找命令-> http://www.yesky.com/210/1 ...

  9. hibernate3和spring整合的一些方式

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  10. 利用android proguard混淆代码

    利用android proguard混淆代码 2014-02-05 17:50 1207人阅读 评论(1) 收藏 举报 网上虽然有很多相关博客,不过貌似都不是最新版的..于是百度+谷歌+github上 ...