04/23/2020
動態繫結(runtime binding)
抽象基類
訪問控制與繼承
友元與繼承
繼承中的類作用域 ****
虛析構函式
繼承與容器
物件導向程式設計的核心思想是資料抽象、繼承和動態繫結。1
繼承: 定義相似的型別並對其相似關係建模
動態繫結: 忽略相似型別的區別
派生類必須在其內部對所有重新定義的虛函式進行宣告,如果不想重寫,可以不要宣告。
protected 訪問運算子,基類希望它的派生類有權訪問該成員,同時禁止其他使用者訪問。
final,防止繼承發生的方法,不作基類
繼承與靜態成員
如果基類有乙個靜態成員,則整個繼承體系中只存在該成員的唯一定義。1
意思就是說,靜態成員沒有被繼承,而是像派生類指向了靜態成員,所以只存在唯一的例項
當我們使用基類的引用或指標呼叫乙個虛函式時將發動動態繫結。1
呼叫virtual函式,只有在執行中才確認呼叫誰的函式
派生類不想動態繫結,就想使用基類的虛函式怎麼辦?迴避虛函式呼叫
純虛函式的類是抽象基類
class
base
;class
derived
:public base
;
原因:友元take函式是派生類的,不是base類的。
派生訪問說明符對於派生類的成員及友元能否訪問其直接基類成員沒有影響,但是與間接基類有印象。影響下下代。
派生類向基類轉換
友元關係不能傳遞一樣,也不能繼承。
改變個別成員的可訪問性:使用using;
當存在繼承關係時,派生類的作用域巢狀在其基類的作用域之內。然後從內向外查詢其他作用域。
靜態型別決定我們能使用哪些成員,存在與哪一塊作用域中。
base bb;
base* b =
new derived;
//靜態型別是base類
當找尋乙個名字,可能是成員函式或者變數,首先會在自己類中的作用域尋找,找不到,向外找尋,基類,或者基類的基類等等,一旦找到之後,再判斷是否是虛函式,如果是虛函式,就呼叫動態繫結的物件的函式。
名字查詢與繼承
classa}
;classb:
public a
void
print2()
};classc:
public b}/*
巢狀關係
class a
; };
};靜態決定在什麼作用域裡面
動態決定呼叫虛函式中哪乙個函式
如果沒有找到,從一層層作用域往上找。
*/b b;
//靜態型別b
a* a =
&b;//靜態型別a
a->
print()
;//正確的,先找到class a中的print,發現是虛函式,所以動態列印b裡面的print
a->
print2()
;//錯誤的,a類沒有print2成員函式
c c;
//靜態型別c
a =&c;
a ->
print()
;// 輸出 c class
//但是c中沒有虛函式print列印誰的,輸出:b class
名字衝突與繼承struct base
;struct derived
;derived d,base b;
d.memfcn()
;//錯誤的,基類base的memfcn被隱藏了
d.base::
memfcn()
;//通過作用域來呼叫基類的
在建構函式和析構函式中呼叫虛函式
如果建構函式中訪問虛函式,正好虛函式呼叫派生類的虛函式,如果訪問到這個派生類某個成員還沒有被初始化,那程式會崩潰。執行順序很重要,繼承中初始化的順序是建構函式從基類到派生類,析構函式次序相反。
容器中存放的繼承物件的時候,建議使用智慧型指標或者指標而非物件。
c++ primer 第五版第十五章 ↩︎
↩︎↩︎↩︎
c++ primer 第五版 15.6節 ↩︎
C 小細節7 右值引用
04 24 2020 std move移動操作 知識總結 右值是臨時物件,臨時物件是什麼?現在多了乙個右值引用,它可以接受臨時物件,並且延長它的生命週期而且還有位址可以獲得。右值引用指向將要被銷毀的物件,因此,我們可以從繫結到右值引用的物件 竊取 狀態。相當於去偷快要銷毀的物件。例子1 隱式型別轉換...
物件導向小練習
練習1 編寫乙個學生類,產生一堆學生物件 要求 有乙個計數器 屬性 統計總共例項了多少個物件 class student school luffycity 類的資料屬性 類變數 count 0 def init self,age,name 獨有的特徵 self.age age self.name n...
C 程式設計小細節
本文寫給自己看看,記錄一些程式設計中的小細節!1.if 0 a 當我們判斷變數與一常量是否相等時,最好把常量 0 放前面,而不是寫成if a 0 因為如果我們手誤,當判斷語句 寫成了 那麼if 0 a 會直接報錯,方便我們發現錯誤,而if a 0 不會。常見情況還有比如 if nullptr p 2...