關于工作和讀書的筆記
[原創文章歡迎轉載,但請保留作者信息]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