C++面向對象
-
virtual
只出現在聲明,不出現在定義。 -
派生類可以訪問
public
和protected
成員,不可訪問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);