关于工作和读书的笔记
[原创文章欢迎转载,但请保留作者信息]Justin 于 2010-01-18
因为Cyclops项目的启动,读书的进度显然慢了很多。不过还是那句话:学习可以中断,但是不能终止。还是要逼自己不停读书做笔记的。
今天就进入第六章了,继承与面向对象,OO。32条军规比较古老了:公有继承(public inheritance)是典型的“是一个”(is-a)模型。
例子也很简单:男人“是一个”人,男人“公有继承”了人。“人”都能去的地方,“男人”也应该能去;“男人”能干的事,“人”却不一定可以干@#¥%
但是实际情况中很多“是一个”的体现并不那么纯粹:大师说“鸟”都会飞,但是实际上是有不会飞的“鸟”的。
在公有继承中,有两种办法来解决这种“不纯粹”: - 多重继承。对于“鸟”的例子,设计一个“鸟”类,然后从中派生出一个“不会飞的鸟”类和一个“会飞的鸟”类,然后再在它们之中分别派生其他具体的“鸟”们。 - 允许运行时出错。还是“鸟”的例子,对于每一个“鸟”类的派生类,不管它是不是能飞,都会有个“飞”的函数。不同的是,能飞的“鸟”就直接飞了,不能飞的“鸟”则会在“飞”函数里说:”对不起,我不能飞,找别人去吧……”(所谓的运行时错误,runtime error)
剩下的也没什么好说的了,大师要求的不多:牢记公有继承是典型的“是一个”模型。item 33之所以放在这里一起记,是因为确实没有太多要记的。说到底就是C++的名字查找规则。完整的规则我还不知道,书里也没说。不过一个大致的规则还是有的,类似剥洋葱:
但是总会有这样的情况,在“洋葱”的内部某层定义了和外部某层一样名字的函数:使得位于内部的函数“屏蔽”了外部的同名函数(哪怕两个函数拥有不同的参数表)。大师说:第一,在公有继承中,上述的情况是不允许存在的,因为从定义上来说,公有继承中的子类应该具备父类所有的特征和功能,应该“是一个”父类。第二,如果在上述情况中需要调用/访问被“屏蔽”的函数/对象,有两个方法可以采用:
两种方法示例见下,Derived_0是有“屏蔽”问题的类,Derived_1和Derived_2分别是采用了第一种和第二种方法的类。
个人觉得,第一种方法应该更漂亮些……
Copyright @ Justin.H Powered by: .Text and ASP.NET Theme by: .NET Monster