C++再學習之路(五)
1.繼承和動態綁定在兩個方面簡化了我們的程序
能夠容易地定義與其他類相似但又不相同的新類,能夠更容易地編寫忽略這些相似類型之間區別的程序 P471
2.之所以稱通過繼承而相關聯的類型為多態類型,是因為在許多情況下可以互換地使用派生類型或基類類型的“許多形態”,在C++ 中,多態性僅用於通過繼承而相關聯的類型的引用或指針 P472
3.基類必須指出希望派生類重定義哪些函數,定義為 virtual 的函數是基類期待派生類重新定義的,基類希望派生類繼承的函數不能定義為虛函數 P472
4.通過動態綁定我們能夠編寫程序使用繼承層次中任意類型的對象,無需關心對象的具體類型,使用這些類的程序無需區分函數是在基類還是在派生類中定義的 P473
5.通過基類的引用(或指針)調用虛函數時,發生動態綁定,引用(或指針)既可以指向基類對象也可以指向派生類對象,這一事實是動態綁定的關鍵,用引用(或指針)調用的虛函數在運行時確定,被調用的函數是引用(或指針)所指對象的實際類型所定義的 P473
6.除了構造函數外,任意非 static 成員函數都可以是虛函數,保留字 virtual 只在類內部的成員函數聲明中出現,不能在類定義體外部出現的函數定義上 P474
7.像 public 成員一樣,protected 成員可以被派生類對象訪問;像 private 成員一樣, protected 成員不能被類的用戶訪問;派生類只能通過派生類對象訪問其基類的 protected 成員,派生類對其基類類型對象的 protected 成員沒有特殊訪問權限 P475
8.被繼承的類必須決定實現的哪些部分聲明為 protected 而哪些部分聲明為 private ,希望禁止派生類訪問的成員應該設為 private ,提供派生類實現所需操作或數據的成員應設為 protected ,提供給派生類型的接口是 protected 成員和 public 成員的組合 P479
9.因為每個派生類對象都包含基類部分,所以可將基類類型的引用綁定到派生類對象的基類部分,也可以用指向基類的指針指向派生類對象 P479
double print_total(const Item_base&, size_t); Item_base item; print_total(item,10); Item_base *p = &item; Bulk_item bulk; print_total(bulk, 10); p = &bulk;
10.將基類類型的引用或指針綁定到派生類對象對基類沒有任何影響,對象本身不會有任何改變,仍為派生類對象,對象的實際類型可能不同於該對象引用或指針的靜態類型,這是C++ 動態綁定的關鍵 P480
11.派生類虛函數調用基類版本時,必須顯式使用作用域操作符,如果派生類函數忽略了這樣做,則函數調用會在運行時確定並且將是一個自身調用,從而導致無窮遞歸 P481
12.無論派生列表中是什麽訪問標號,所有繼承 Base 的類對 Base 中的成員具有相同的訪問,派生訪問標號將控制派生類的用戶對從 Base 繼承而來的成員的訪問 P483
13.友元關系不能繼承,基類的友元對派生類的成員沒有特殊訪問權限,如果基類被授予友元關系,則只有基類具有特殊訪問權限,該基類的派生類不能訪問授予友元關系的類 486
14.將派生類對象轉化為基類類型引用,將對象傳遞給希望接受引用的函數時,引用直接綁定到該對象,雖然看起來在傳遞對象,實際上實參是對該對象的引用,對象本身未被復制,並且,轉換不會在任何方面改變派生類型對象,該對象仍是派生類型對象;用派生類對象對基類對象進行初始化或賦值,將派生類對象傳遞給希望接收基類類型對象(而不是引用)的函數時,該派生類類型對象的基類部分被復制到實參 P488
15.一個類只能初始化自己的直接基類,直接基類就是在派生列表中指定的類,派生類應通過使用基類構造函數尊重基類的初始化意圖,而不是在派生類構造函數函數體中對這些成員賦值 P492
16.重構包括重新定義類層次,將操作和/或數據從一個類移到另一個類,為了適應應用程序的需要而重新設計類以便增加新函數或處理其他改變時,最有可能進行重構 P492
C++再學習之路(五)