第十五章 面向對象程序設計

  1. 面向對象程序設計(object-oriented programming)的核心思想是數據抽象、繼承和動態綁定。
  2. C++11 標準允許派生類顯示地註明它將使用哪個成員函數改寫基類的虛函數,具體措施是在該函數的形參列表之後增加一個 override 關鍵字。
  3. 在C++語言中,當我們使用基類的引用或指針調用一個虛函數時將發生動態綁定。
  4. 基類通常都應該定義一個虛析構函數,即使該函數不執行任何實際操作也是如此。
  5. 任何構造函數以外的非靜態函數都可以是虛函數。關鍵字 virtual 只能出現在類內部的生命語句之前而不能用於類外部的函數定義。如果基類把一個函數聲明成虛函數,則該函數在派生類中隱式地也是虛函數。
  6. 成員函數如果沒有被聲明成虛函數,則其解析過程發生在編譯時而非運行時。
  7. 如果基類定義了一個靜態成員,則在整個繼承體系中只存在該成員的唯一定義。
  8. C++11 新標準提供了一種防止繼承發生的方法,即在類名後跟一個關鍵字 final 。
  9. 理解基類和派生類之間的類型轉換是理解C++語言面向對象編程的關鍵所在。
  10. 當我們用一個派生類對象爲一個基類對象初始化或賦值時,只有該派生類對象中的基類部分會被拷貝、移動或賦值,它的派生類部分將被忽略掉。
  11. 要理解在具有繼承關係的類之間發生的類型轉換,有三點非常重要:
        ① 從派生類向基類的類型轉換隻對指針或引用類型有效;
        ② 基類向派生類不存在隱式類型轉換;
        ③ 和任何其他成員一樣,派生類向基類的類型轉換也可能會由於訪問受限而變得不可行。
        (儘管自動類型轉換隻對指針或引用類型有效,但是繼承體系中的大多數類仍然(顯示或隱式地)定義了拷貝控制成員。因此,我們通常能夠將一個派    生類對象拷貝、移動或賦值給一個基類對象)
  12. 動態綁定只有當我們通過指針或引用調用虛函數時纔會發生。
  13. 基類中的虛函數在派生類中隱含地也是一個虛函數。當派生類覆蓋了某個虛函數時,該函數在基類中的形參必須與派生類中的形參嚴格匹配。
  14. 如果某次函數調用使用了默認實參,則該實參值由本次調用的靜態類型決定。(如果虛函數使用默認實參,則基類和派生類中定義的默認實參最好一致。)
  15. 如果我們希望對虛函數的調用不要進行動態綁定,而是強迫其執行虛函數的某個特定版本。使用作用於運算符可以實現這一目的。通常情況下,只有成員函數(或友元)中的代碼需要使用作用域運算符來回避虛函數的機制。
  16. 含有(或者未經覆蓋直接繼承)純虛函數的類時抽象基類(abstract base class)。我們不能創建抽象基類的對象。
  17. 派生類的成員或友元只能通過派生類對象來訪問基類的受保護成員。
  18. 派生訪問說明符的目的是控制派生類用戶(包括派生類的派生類在內)對於基類成員的訪問權限。、
  19. 對於代碼中的某個給定節點來說,如果基類的公有成員是可訪問的,則派生類向基類的類型轉換也是可訪問的;反之則不行。
  20. 不能繼承友元關係;每個類負責控制各自成員的訪問權限。
  21. 派生類只能爲那些它可以訪問的名字提供 using 聲明。
  22. 人們常常有一種錯覺,認爲在使用 struct 關鍵字和 class 關鍵字定義的類之間還有更深層次的差別。事實上,唯一的差別就是默認成員訪問說明符及默認派生訪問說明符;除此之外,再無其他不同之處。
  23. 一個對象、引用或指針的靜態類型決定了該對象的哪些成員是可見的。
  24. 派生類的成員將隱藏同名的基類成員。我們可以通過作用於運算符來使用一個被隱藏的基類成員。(除了覆蓋繼承而來的虛函數之外,派生類最好不要重用其他定義在基類中的名字。)
  25. 和其他作用域一樣,如果派生類(即內層作用域)的成員與基類(即外層作用域)的某個成員同名,則派生類將在其作用域內隱藏該基類的成員。即使派生類成員和基類成員的形參列表不一樣,基類成員也仍然會被隱藏掉。
  26. 如果基類的析構函數不是虛函數,則 delete 一個指向派生類的基類指針將產生未定義的行爲。(動態綁定析構函數)
  27. 如果一個類定義了析構函數,即使它通過 =default 的形式使用了合成的版本,編譯器也不會爲這個類合成移動操作。
  28. 當派生類定義了拷貝或移動操作時,該操作負責拷貝或移動包括基類部分成員在內的整個對象。
  29. 在默認情況下,基類默認構造函數初始化派生類對象的基類部分。如果我們想拷貝(或移動)基類部分,則必須在派生類的構造函數初始值列表中顯示地使用基類的拷貝(或移動)構造函數。
  30. 與拷貝和移動構造函數一樣,派生類的賦值運算符也必須顯示地爲其基類部分賦值。
  31. 如果構造函數或析構函數調用了某個虛函數,則我們應該執行與構造函數或析構函數所屬類型相對應的虛函數版本。
  32. 如果基類含有幾個構造函數,則除了兩個例外情況,大多數時候派生類會繼承所有這些構造函數:
        ① 如果派生類定義的構造函數與基類的構造函數具有相同的參數列表,則該構造函數將不會被繼承。
        ② 默認、拷貝和移動構造函數不會被繼承。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章