C++ 面向對象筆記

C++面向對象

  • virtual只出現在聲明,不出現在定義。

  • 派生類可以訪問publicprotected成員,不可訪問private成員

  • 對象之間不存在類型轉換

  • 派生類向基類的類型轉換隻對指針和引用有效

  • 基類的引用或指針的靜態類型和動態類型可能不一樣。

  • 當通過基類的引用或者指針調用虛函數時,在運行時才確定下來調用的虛函數的版本,如果指針或引用綁定的是派生類的對象,那會運行派生類的虛函數。當通過對象調用虛函數時,在編譯期就可以確定。

  • 繼承虛函數最好在聲明結尾寫上override

  • 派生類可以看作和基類的連體嬰兒,是一個擴充,但對基類的訪問有所限制。

  • 虛函數的默認實參按調用的靜態類型的默認實參決定。

  • 避免對虛函數動態綁定:使用作用域運算符:DerivedP->Base::f();。通常情況下是派生類調用其基類的虛函數版本時需要使用,基類版本通常完成所有繼承層次中類型的共同任務,而派生類中的虛函數只需定義和自身密切相關的操作。

  • 在聲明分號前寫= 0代表純虛函數。有純虛函數的類是抽象類,不允許定義對象。

  • 在Quote的繼承體系中增加Disc_quote類是重構,重構負責將操作或數據從一個類轉移到另一個類,即使重構了繼承體系,引用了Bulk_quote或Quote的代碼也無需改變。

  • 派生類的類作用域嵌套在基類的作用域裏,重名會將基類中的成員覆蓋,而不會重載即使是參數不一樣。當然可以使用作用域運算符訪問被覆蓋的成員Base::covered_member

  • 如果派生類的函數名與基函數的虛函數名相同,會將其隱藏而不是派生一個新的虛函數。

  • 如果想重載基類中的函數,需要在派生類中using Base::f;,然後再定義派生類的f()

  • 析構函數要定義成虛函數,防止一個Base類指針指向派生類,delete的時候選錯析構函數的版本。

  • 向一個基類的容器傳入派生類對象,只會將其基類的部分傳入,調用虛函數的版本是基類的版本。好的做法是定義成基類的智能指針的容器,傳入容器時派生類的指針會轉換成基類的指針,但他指向的還是派生類對象,指針具有動態類型,調用虛函數會調用派生類版本。

  • delctype(f)獲得函數類型,用decltype(f)*獲得函數指針

    multiset<int, decltype(com)*> st(com);
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章