1、在c++中,基類將型別相關的函式與派生類不做改變直接繼承的函式區分對待。對於某些函式,基類希望它的派生類各自定義適合自身的版本,此時基類就將這些函式宣告成虛函式(virtual function)。
2、在c++中,當我們使用基類的引用(或指標)呼叫乙個虛函式時將發生動態繫結。
3、關鍵字virtual只能出現在類內部的宣告語句之前而不能用於類外部的函式定義。如果基類把乙個函式宣告成虛函式,則該函式在派生類中隱式地也是虛函式。
4、派生類可以繼承定義在基類中的成員,但是派生類的成員函式不一定有權訪問從基類繼承而來的成員。和其他使用基類的**一樣,派生類能訪問公有成員,而不能訪問私有成員。不過在某些時候基類中還有這樣一類成員,基類希望它的派生類有權訪問該成員,同時禁止其他使用者訪問。我們用protected訪問運算子說明這樣的成員。
5、如果我們想將某個類用作基類,則該類必須定義而非僅僅宣告。
6、在定義乙個類時,如果不希望其他類繼承它,或者不想考慮它是否適合作為乙個基類。為了實現這個目的,c++11新標準提供了一種防止繼承發生的方法,即在類名後跟乙個關鍵字final:
class noderived final {}; //noderived不能作為基類
class base{};
class last final : base{}; //last不能作為基類
class bad : noderived ; //錯誤:noderived是final的
class bad2 : last ; //錯誤:last是final的
7、基類的指標或引用的靜態型別可能與其動態型別不一致,但是如果表示式既不是引用也不是指標,則它的動態型別永遠與靜態型別一一致。
8、當我們用乙個派生類物件為乙個基類物件初始化或賦值時,只有該派生類物件中的基類部分會被拷貝,移動或賦值,它的派生類部分將被忽略掉。
9、所有的虛函式都必須有定義。
10、當且僅當對通過指標或引用呼叫虛函式時,才會在執行時解析該呼叫,也只有在這種情況下物件的動態型別才有可能與靜態型別不同。
11、乙個派生類的函式如果覆蓋了某個繼承而來的虛函式,則它的形參型別必須與被它覆蓋的基類函式完全一致。在這裡要注意過載(overload)和覆蓋(override)的區別,過載是函式名相同,形參不同,處於相同的空間,覆蓋是函式名和形參完全相同,但應用於不同的範圍(派生類和基類)。
12、處於好的設計模式的考慮,只有虛函式才能被覆蓋。
13、如果派生類的虛函式擁有預設實參,最好與基類函式中的實參一致,因為呼叫派生類函式的時候,所用的實參都是基類函式中的實參,不會去管你派生類函式裡定義的實參。
14、純虛函式表示這個函式沒有實際意義,乙個純虛函式無須定義,通過在宣告語句的分號之前書寫=0就可以將乙個虛函式說明為純虛函式,其中=0只能出現在類內部的虛函式宣告語句處。含有(或者未經覆蓋直接繼承)純虛函式的類是抽象基類。抽象基類負責定義介面,而後續的其他類可以覆蓋該介面,不能直接建立乙個抽象基類的物件。
15、假定d繼承自b:
16、派生類只能為那些它可以訪問的名字提供using宣告。
17、派生類的成員將隱藏同名的基類成員。如果派生類的成員與基類的某個成員同名,則派生類將在其作用域內隱藏該基類成員。即使派生類成員和基類成員的形參列表不一致,基類成員也仍然會被隱藏掉。
C Primer 物件導向程式設計
1.要注意區分類和類物件,物件只能訪問public成員,而類和友元可以訪問private成員。而對於基類的protected成員,派生類可以訪問其基類的protected成員 友元中也可以訪問protected成員 不能通過派生類物件在類外訪問protected成員 這點與private類似 值得注...
c primer 物件導向程式設計
1.重構現象 因為派生類的建構函式只能初始化它的直接基類,所以這樣就出現了一種新的現象 重構,重構是很常見的,它是指在子類中重新定義父類的建構函式,已達到自己想要的建構函式。重構要注意的是一旦被重構,編譯器必須重新編譯這些類的 class pp class d1 public base class ...
c primer 物件導向程式設計筆記
1 動態繫結 在c 中,通過基類的引用 或指標 呼叫虛函式時,發生動態繫結。引用 或指標 既可以指向基類物件也可以指向派生類物件。2 虛函式 1 保留字virtual 只在類內部的成員函式宣告中出現,不能用在類定義體外部初相的函式定義上。2 派生類中虛函式的宣告必須與基類中的定義完全匹配,但有乙個例...