动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息



本月文章推荐
.数据结构学习(C++)之栈和队列.
.use Assembly to call a method.
.水滴石穿C语言之指针综合谈.
.C语言初学者入门讲座 第十讲 函数.
.C++ 类的作用域.
.C++中建立对象间消息连接的系统方.
.C++的心得: 这些秘籍你知道吗?.
.水滴石穿C语言之C语言的底层操作.
.银行常用的打印程序.
.七年IT奋斗纪实及感悟.
.让C/C++图形程序独立运行.
.庆祝20岁生日: C++图书热点观察.
.类模拟的性能分析.
.如何编程实现bin文件转化为iso文.
.模仿szk的tbf制作工具.
.C语言字符屏幕函数.
.C++箴言:绝不重定义继承的非虚拟.
.C语言库函数(H类字母).
.Windows的动态链接库原理及使用1.
.自制c语言编制cgi实现搜索功能.

C++箴言:谨慎使用私有继承

发表日期:2008-3-8 |



  在《C++箴言:确保公开继续模拟“is-a”》一文中论述了 C++ 将 public inheritance(公有继续)视为一个 is-a 关系。
当给定一个 hierarchy(继续体系),其中有一个 class Student 从一个 class Person 公有继续,当为一个函数调用的成功而有必要时,需要将 Students 隐式转型为 Persons,它通过向编译器展示来做到这一点。用 private inheritance(私有继续)代替 public inheritance(公有继续)把这个例子的一部分重做一下是值得的:

  class Person { ... };
  class Student: private Person { ... }; // inheritance is now private

  void eat(const Person p); // anyone can eat

  void study(const Student s); // only students study

  Person p; // p is a Person
  Student s; // s is a Student

  eat(p); // fine, p is a Person

  eat(s); // error! a Student isn't a Person

  很明显,private inheritance(私有继续)不意味着 is-a。那么它意味着什么呢?

  “喂!”你说:“在我们得到它的含义之前,我们先看看它的行为。private inheritance(私有继续)有怎样的行为呢?”好吧,支配 private inheritance(私有继续)的第一个规则你只能从动作中看到:与 public inheritance(公有继续)对照,假如 classes(类)之间的 inheritance relationship(继续关系)是 private(私有)的,编译器通常不会将一个 derived class object(派生类对象)(诸如 Student)转型为一个 base class object(基类对象)(诸如 Person)。这就是为什么为 object(对象)s 调用 eat 会失败。第二个规则是从一个 private base class(私有基类)继续的 members(成员)会成为 derived class(派生类)的 private members(私有成员),即使它们在 base class(基类)中是 protected(保护)的或 public(公有)的。

  行为不过如此。这就给我们带来了含义。private inheritance(私有继续)意味着 is-implemented-in-terms-of(是根据……实现的)。假如你使 class(类)D 从 class(类)B 私有继续,你这样做是因为你对于利用在 class(类)B 中才可用的某些特性感爱好,而不是因为在 types(类型)B 和 types(类型)D 的 objects(对象)之间有什么概念上的关系。同样地,private inheritance(私有继续)纯粹是一种实现技术。(这也就是为什么你从一个 private base class(私有基类)继续的每一件东西都在你的 class(类)中变成 private(私有)的原因:它全部都是实现的细节。)利用《接口继续和实现继续》中提出的条款,private inheritance(私有继续)意味着只有 implementation(实现)应该被继续;interface(接口)应该被忽略。

  假如 D 从 B 私有继续,它就意味着 D objects are implemented in terms of B objects(D 对象是根据 B 对象实现的),没有更多了。private inheritance(私有继续)在 software design(软件设计)期间没有任何意义,只在 software implementation(软件实现)期间才有。 private inheritance(私有继续)意味着 is-implemented-in-terms-of(是根据……实现的)的事实有一点混乱,正如《通过composition模拟“has-a”》一文中所指出的 composition(复合)也有同样的含义。你怎么预先在它们之间做出选择呢?答案很简单:只要你能就用 composition(复合),只有在绝对必要的时候才用 private inheritance(私有继续)。什么时候是绝对必要呢?主要是当 protected members(保护成员)和/或 virtual functions(虚拟函数)掺和进来的时候,另外还有一种与空间相关的极端情况会使天平向 private inheritance(私有继续)倾斜。我们稍后再来操心这种极端情况。

  究竟,它只是一种极端情况。 假设我们工作在一个包含 Widgets 的应用程序上,而且我们认为我们需要更好地理解 Widgets 是怎样被使用的。例如,我们不仅要知道 Widget member functions(成员函数)被调用的频度,还要知道 call ratios(调用率)随着时间的流逝如何变化。带有清楚的执行阶段的程序在不同的执行阶段可以有不同的行为侧重。
例如,一个编译器在解析阶段对函数的使用与优化和代码生成阶段就有很大的不同。

  我们决定修改 Widget class 以持续跟踪每一个 member function(成员函数)被调用了多少次。在运行时,我们可以周期性地检查这一信息,与每一个 Widget 的这个值相伴的可能还有我们觉得有用的其它数据。为了进行这项工作,我们需要设立某种类型的 timer(计时器),以便在到达收集用法统计的时间时我们可以知道。

  尽可能复用已有代码,而不是写新的代码,我在我的工具包中翻箱倒柜,而且满足地找到下面这个 class(类):

  class Timer {
  public:
  eXPlicit Timer(int tickFrequency);
  virtual void onTick() const; // automatically called for each tick
  ...
  };

  这正是我们要找的:一个我们能够根据我们的需要设定 tick 频率的 Timer object,而在每次 tick 时,它调用一个 virtual function(虚拟函数)。我们可以重定义这个 virtual function(虚拟函数)以便让它检查 Widget 所在的当前状态。很完美!

  在《C++箴言:确保公开继续模拟“is-a”》一文中论述了 C++ 将 public inheritance(公有继续)视为一个 is-a 关系。当给定一个 hierarchy(继续体系),其中有一个 class Student 从一个 class Person 公有继续,当为一个函数调用的成功而有必要时,需要将 Students 隐式转型为 Persons,它通过向编译器展示来做到这一点。用 private inheritance(私有继续)代替 public inheritance(公有继续)把这个例子的一部分重做一下是值得的:

  class Person { ... };
  class Student: private Person { ... }; // inheritance is now private

  void eat(const Person p); // anyone can eat

  void study(const Student s); // only students study

  Person p; // p is a Person
  Student s; // s is a Student

  eat(p); // fine, p is a Person

  eat(s); // error! a Student isn't a Person

  很明显,private inheritance(私有继续)不意味着 is-a。那么它意味着什么呢?

  “喂!”你说:“在我们得到它的含义之前,我们先看看它的行为。private inheritance(私有继续)有怎样的行为呢?”好吧,支配 private inheritance(私有继续)的第一个规则你只能从动作中看到:与 public inheritance(公有继续)对照,假如 classes(类)之间的 inheritance relationship(继续关系)是 private(私有)的,编译器通常不会将一个 derived class object(派生类对象)(诸如 Student)转型为一个 base class object(基类对象)(诸如 Person)。这就是为什么为 object(对象)s 调用 eat 会失败。第二个规则是从一个 private base class(私有基类)继续的 members(成员)会成为 derived class(派生类)的 private members(私有成员),即使它们在 base class(基类)中是 protected(保护)的或 public(公有)的。

  行为不过如此。这就给我们带来了含义。private inheritance(私有继续)意味着 is-implemented-in-terms-of(是根据……实现的)。假如你使 class(类)D 从 class(类)B 私有继续,你这样做是因为你对于利用在 class(类)B 中才可用的某些特性感爱好,而不是因为在 types(类型)B 和 types(类型)D 的 objects(对象)之间有什么概念上的关系。同样地,private inheritance(私有继续)纯粹是一种实现技术。(这也就是为什么你从一个 private base class(私有基类)继续的每一件东西都在你的 class(类)中变成 private(私有)的原因:它全部都是实现的细节。)利用《接口继续和实现继续》中提出的条款,private inheritance(私有继续)意味着只有 implementation(实现)应该被继续;interface(接口)应该被忽略。

  假如 D 从 B 私有继续,它就意味着 D objects are implemented in terms of B objects(D 对象是根据 B 对象实现的),没有更多了。private inheritance(私有继续)在 software design(软件设计)期间没有任何意义,只在 software implementation(软件实现)期间才有。 private inheritance(私有继续)意味着 is-implemented-in-terms-of(是根据……实现的)的事实有一点混乱,正如《通过composition模拟“has-a”》一文中所指出的 composition(复合)也有同样的含义。你怎么预先在它们之间做出选择呢?答案很简单:只要你能就用 composition(复合),只有在绝对必要的时候才用 private inheritance(私有继续)。什么时候是绝对必要呢?主要是当 protected members(保护成员)和/或 virtual functions(虚拟函数)掺和进来的时候,另外还有一种与空间相关的极端情况会使天平向 private inheritance(私有继续)倾斜。我们稍后再来操心这种极端情况。

  究竟,它只是一种极端情况。
假设我们工作在一个包含 Widgets 的应用程序上,而且我们认为我们需要更好地理解 Widgets 是怎样被使用的。例如,我们不仅要知道 Widget member functions(成员函数)被调用的频度,还要知道 call ratios(调用率)随着时间的流逝如何变化。带有清楚的执行阶段的程序在不同的执行阶段可以有不同的行为侧重。例如,一个编译器在解析阶段对函数的使用与优化和代码生成阶段就有很大的不同。

  我们决定修改 Widget class 以持续跟踪每一个 member function(成员函数)被调用了多少次。在运行时,我们可以周期性地检查这一信息,与每一个 Widget 的这个值相伴的可能还有我们觉得有用的其它数据。为了进行这项工作,我们需要设立某种类型的 timer(计时器),以便在到达收集用法统计的时间时我们可以知道。

  尽可能复用已有代码,而不是写新的代码,我在我的工具包中翻箱倒柜,而且满足地找到下面这个 class(类):

  class Timer {
  public:
  explicit Timer(int tickFrequency);
  virtual void onTick() const; // automatically called for each tick
  ...
  };

  这正是我们要找的:一个我们能够根据我们的需要设定 tick 频率的 Timer object,而在每次 tick 时,它调用一个 virtual function(虚拟函数)。我们可以重定义这个 virtual function(虚拟函数)以便让它检查 Widget 所在的当前状态。很完美!

上一篇:C++箴言:考虑可选的虚拟函数的替代方法 人气:298
下一篇:C语言设计初学者的十八颗“地雷” 人气:222
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-8 ECShop v2.6.0 Build 20080707(G
2008-7-8 动网论坛PHP版 v2.0++ Build 080
2008-7-8 中国IT总舵 v9.0 UTF版
2008-7-8 凹丫丫新闻发布系统 v4.6 Build
2008-7-8 topview数据查询 v3.0
2008-7-8 Z-Blog v1.8 Spirit Build 80708
2008-7-8 Z-Blog v1.8 Spirit Build 80708
2008-7-8 凹丫丫新闻发布系统 v4.6 Build
2008-7-8 新动软万能网站内容管理cms系统
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 GoodCalculator2.0版固件计算器
2008-7-5 RepoName源地址搜索工具 v1.21b
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 TouchCopy多媒体管理软件 v3.13完
2008-7-5 VideosTone视频铃声 v1.1汉化破解
2008-7-5 TouchPad触摸板 v4.44破解版
2008-7-5 VideosTone破解补丁 v1.0
2008-7-5 Feeds GoogleReader客户端 v0.4.3


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報