關(guān)于工作和讀書的筆記
[原創(chuàng)文章歡迎轉(zhuǎn)載,但請(qǐng)保留作者信息]Justin 于 2010-01-18
因?yàn)镃yclops項(xiàng)目的啟動(dòng),讀書的進(jìn)度顯然慢了很多。不過還是那句話:學(xué)習(xí)可以中斷,但是不能終止。還是要逼自己不停讀書做筆記的。
今天就進(jìn)入第六章了,繼承與面向?qū)ο螅琌O。32條軍規(guī)比較古老了:公有繼承(public inheritance)是典型的“是一個(gè)”(is-a)模型。
例子也很簡(jiǎn)單:男人“是一個(gè)”人,男人“公有繼承”了人。“人”都能去的地方,“男人”也應(yīng)該能去;“男人”能干的事,“人”卻不一定可以干@#¥%
但是實(shí)際情況中很多“是一個(gè)”的體現(xiàn)并不那么純粹:大師說“鳥”都會(huì)飛,但是實(shí)際上是有不會(huì)飛的“鳥”的。
在公有繼承中,有兩種辦法來解決這種“不純粹”:?- 多重繼承。對(duì)于“鳥”的例子,設(shè)計(jì)一個(gè)“鳥”類,然后從中派生出一個(gè)“不會(huì)飛的鳥”類和一個(gè)“會(huì)飛的鳥”類,然后再在它們之中分別派生其他具體的“鳥”們。?- 允許運(yùn)行時(shí)出錯(cuò)。還是“鳥”的例子,對(duì)于每一個(gè)“鳥”類的派生類,不管它是不是能飛,都會(huì)有個(gè)“飛”的函數(shù)。不同的是,能飛的“鳥”就直接飛了,不能飛的“鳥”則會(huì)在“飛”函數(shù)里說:”對(duì)不起,我不能飛,找別人去吧……”(所謂的運(yùn)行時(shí)錯(cuò)誤,runtime error)
剩下的也沒什么好說的了,大師要求的不多:牢記公有繼承是典型的“是一個(gè)”模型。item 33之所以放在這里一起記,是因?yàn)榇_實(shí)沒有太多要記的。說到底就是C++的名字查找規(guī)則。完整的規(guī)則我還不知道,書里也沒說。不過一個(gè)大致的規(guī)則還是有的,類似剝洋蔥:
但是總會(huì)有這樣的情況,在“洋蔥”的內(nèi)部某層定義了和外部某層一樣名字的函數(shù):使得位于內(nèi)部的函數(shù)“屏蔽”了外部的同名函數(shù)(哪怕兩個(gè)函數(shù)擁有不同的參數(shù)表)。大師說:第一,在公有繼承中,上述的情況是不允許存在的,因?yàn)閺亩x上來說,公有繼承中的子類應(yīng)該具備父類所有的特征和功能,應(yīng)該“是一個(gè)”父類。第二,如果在上述情況中需要調(diào)用/訪問被“屏蔽”的函數(shù)/對(duì)象,有兩個(gè)方法可以采用:
兩種方法示例見下,Derived_0是有“屏蔽”問題的類,Derived_1和Derived_2分別是采用了第一種和第二種方法的類。
個(gè)人覺得,第一種方法應(yīng)該更漂亮些……?
Copyright @ Justin.H Powered by: .Text and ASP.NET Theme by: .NET Monster