讀書筆記Effective C 05 個人向

2021-10-20 12:03:52 字數 1281 閱讀 2180

1.pubulic繼承是一種套娃繼承,但凡基類物件能出現的位置,派生類物件是可以替代這個位置的。

2.如果繼承了base類中的函式並且想要過載這個函式是,必須在派生類中使用using base:::func,(注意使用using的時候不要再函式後面加小括號)這樣才不至於因為函式的過載而導致掩蓋掉基類的同名函式。如果派生類以private方式繼承基類,並且指向繼承基類的多個過載函式之一時,此時using宣告派不上用場,因為這樣做會使得基類中的所有過載函式都在派生類中可見。此時派生類可以設計乙個轉交函式,並在轉交函式中清楚地寫出要使用的是基類中的哪乙個函式,比如base::func()。總之,為了使別遮掩的基類函式重建天日,可以使用using來拯救一群或者使用轉交函式來單獨拯救某乙個。

3.區分介面繼承和實現繼承:純虛函式是為了派生函式只繼承介面,實際上在基類中宣告的純虛函式,雖然這個基類是不能被例項化的,但是我們仍然可以為這個純虛函式定義乙個實現,這樣就可以露一手絕活:派生類物件可以通過使用derived_object->base_class::pure_virtual_func()來真實地呼叫這個看似無用的實現。不同於純虛函式,虛函式的目的則是,派生函式可以繼承它的介面以及,預設實現。假如在應用實踐中,很多的派生類都可以使用這個預設實現,那麼何樂而不為呢?但是一旦有新的需求出現了,比如乙個心得派生類物件需要針對這個介面做不同的解釋時,就有可能因為沒有重新定義虛函式介面而釀成大錯。為了解決這個問題,我們可以採取「virtual函式介面」和「預設實現」之間的鏈結。比如基類可以定義乙個純虛函式的同時,再定義乙個別名的函式預設實現,然後派生類在繼承這個基類時,就會不得不重新定義這個純虛函式,但是他們也有了乙個選擇就是直接在重新定義的虛函式中呼叫這個預設實現。而其實這個預設實現完全不必在基類中通過別名來完成,可以直接在基類中定義純虛函式的實現,並把它作為派生類虛函式實現中的預設呼叫。

4.除了腦海中預設的virtual函式的宣告和定義之外,還有其他的virtual函式設計替代方案。比如將virtual函式宣告在private中的nvi手法、strategy模式等等。

5.我們知道,乙個指向基類物件的指標,可以指向不同的派生類。在這個描述中,這樣的指標實際上是有自己的型別的,但是它指向的物件卻不必非要是基類物件。我們稱這個指標為靜態型別,而動態型別表示目前所指物件的型別。絕對不要重新定義乙個繼承而來的預設引數值,因為預設引數值是靜態繫結,而virtual函式卻是動態繫結。

6.使用private繼承意味著派生類只是純粹地想繼承一些技術,而不想跟基類有任何觀念上的聯絡,因此它跟函式的復合很像,但是我們應該盡可能使用復合而並非私有繼承。因為私有繼承的時候基類的函式會變成私有的部分,此時客戶很可能被誤導去呼叫它。

7.繼承真的有點麻煩。。

《effective C 》讀書筆記

1,c 關鍵字explicit c 中,乙個引數的 建構函式 或者除了第乙個引數外其餘引數都有預設值的多參建構函式 承擔了兩個角色。1 是個 構造器,2 是個預設且隱含的型別轉換操作符 所以,有時候在我們寫下如 aaa 這樣的 且恰好 的型別正好是aaa單引數構造器的引數型別,這時候 編譯器就自動呼...

Effective C 讀書筆記

一 讓自己習慣c 1 條款01 視c 為聯邦語言 c 的組成可分為四部分 1.c c 仍然以c語言為基礎。區塊 語句 預處理 內建資料型別 陣列 指標等都來自c。2.object oriented c c with classes所訴說的 classes 包括構造和析構 封裝 繼承 多型 virtu...

讀書筆記 Effective C

部分條款過於深奧,部分條款已了然於心,僅記錄當下所識所學 對於常量巨集定義,最好用const代替 define 對於函式巨集定義,最好用inline代替 define include ifdef ifndef仍被需要 內建物件記得手動初始化 使用成員初始列替換賦值操作 以local static替換...