Note of Justin

关于工作和读书的笔记

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  47 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

留言簿(14)

搜索

  •  

积分与排名

  • 积分 - 51844
  • 排名 - 433

最新评论

阅读排行榜

评论排行榜

[原创文章欢迎转载,但请保留作者信息]
Justin 于 2010-01-18

因为Cyclops项目的启动,读书的进度显然慢了很多。不过还是那句话:学习可以中断,但是不能终止。还是要逼自己不停读书做笔记的。

今天就进入第六章了,继承与面向对象,OO。
32条军规比较古老了:公有继承(public inheritance)是典型的“是一个”(is-a)模型。

例子也很简单:男人“是一个”人,男人“公有继承”了人。“人”都能去的地方,“男人”也应该能去;“男人”能干的事,“人”却不一定可以干@#¥%

但是实际情况中很多“是一个”的体现并不那么纯粹:大师说“鸟”都会飞,但是实际上是有不会飞的“鸟”的。

在公有继承中,有两种办法来解决这种“不纯粹”:
 - 多重继承。对于“鸟”的例子,设计一个“鸟”类,然后从中派生出一个“不会飞的鸟”类和一个“会飞的鸟”类,然后再在它们之中分别派生其他具体的“鸟”们。
 - 允许运行时出错。还是“鸟”的例子,对于每一个“鸟”类的派生类,不管它是不是能飞,都会有个“飞”的函数。不同的是,能飞的“鸟”就直接飞了,不能飞的“鸟”则会在“飞”函数里说:”对不起,我不能飞,找别人去吧……”(所谓的运行时错误,runtime error)

剩下的也没什么好说的了,大师要求的不多:牢记公有继承是典型的“是一个”模型。

item 33之所以放在这里一起记,是因为确实没有太多要记的。说到底就是C++的名字查找规则。
完整的规则我还不知道,书里也没说。不过一个大致的规则还是有的,类似剥洋葱:

  • 先在本地域中查找(local scope,比如说函数内部)是否有该名字的定义,如果没有找到->
  •    往外一层名字域(比如说函数所在的类)中查找,如果没有找到                                 ->
  •       再往外一层名字域(比如说函数所在类的父类)中查找,如果没有找到                    ->
  •          继续忘外一层名字域中查找(比如说函数所在类的父类的父类,等等),一直找到全局名字域(global scope)还是没找到的话,就报告错误。

但是总会有这样的情况,在“洋葱”的内部某层定义了和外部某层一样名字的函数:使得位于内部的函数“屏蔽”了外部的同名函数(哪怕两个函数拥有不同的参数表)。
大师说:
第一,在公有继承中,上述的情况是不允许存在的,因为从定义上来说,公有继承中的子类应该具备父类所有的特征和功能,应该“是一个”父类。
第二,如果在上述情况中需要调用/访问被“屏蔽”的函数/对象,有两个方法可以采用:

  1. using。用using“声明”过完整的名字后,就可以“看见”并使用这个函数/对象了。
  2. 踢皮球函数(forwarding functions)。编写一个函数,把真正的活踢给别人……

两种方法示例见下,Derived_0是有“屏蔽”问题的类,Derived_1和Derived_2分别是采用了第一种和第二种方法的类。

class  Base {
public :
   
virtual   void  func_1();
   
virtual   void  func_1( int  param);
// ..
}


class  Derived_0:  public  Base {
public :
   
virtual   void  func_1();
// ..
}


class  Derived_1:  public  Base {
public :
   
using  Base::func_1;
   
virtual   void  func_1();
// ..
}


class  Derived_2:  private  Base {
public :
   
virtual   void  func_1();
   
virtual   void  func_1( int  param)
   
{ Base::func_1(param);}
// ..
}

个人觉得,第一种方法应该更漂亮些…… 

posted on 2010-02-08 16:32 Justin.H 阅读(374) 评论(0)  编辑 收藏 引用 所属分类: Effective C++ 炒冷饭

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理