多型的含義:不同物件,行為不同。
三個要點:
1.要在繼承關係中才能使用
2.必須是虛函式
3.呼叫函式的型別必須是引用/指標
虛函式的覆寫:
1.必須是虛函式
2.子類中有相同的函式:與父類函式完全相同(函式名、引數、返回值)
例外:1)協變——返回值型別構成繼承關係的指標/引用(也可以)
2)析構函式——基類析構函式定義成虛函式時,子類析構函式只要定義無論是否加virtual關鍵字都構成重寫。
例:以買票為例,學生半票,老師買全票
class person
virtual ~person()
};class student :public person
virtual ~student()
};class teacher :public person
virtual ~teacher()
};void buy(person& p)
void test1()
純虛函式:定義函式的形式為 :virtual 返回值型別 函式名()= 0;當乙個函式被定義成純虛函式以後,其實現就在子類中。該函式就只是乙個介面而已。
抽象類:存在純虛函式的類
抽象類的存在與純虛函式類似,此時該類就成為了乙個介面類,各種介面的實現都在其子類中。
抽象類不能例項化物件。
final / override關鍵字
final:加在函式名後,使該函式不能被子類重寫。——實現繼承例:
此時,在子類中覆寫該函式時,就會編譯報錯。
override:加在函式名後,使得該函式必須被子類重寫——介面繼承例:
此時,也會編譯報錯:
};在該繼承關係中,物件模型如圖:
我們發現父類與子類都有乙個虛表,但是虛表中的內容卻是不盡相同的。
基類存放的是父類的虛函式的位址——虛函式指標;子類存放的是子類的虛函式指標。
至於它的呼叫過程,我們可以這樣來處理:
函式指標執行的函式的內容就是該函式指標所指的物件的虛表中的函式。
多型的實現過程:
1.函式引數為物件的引用/指標。
2.訪問物件的前4/8個位元組的內容,獲取虛表首位址——虛表指標
3.通過虛表指標獲取虛表,調該物件對應的函式。
所以我們可以發現,多型注重的是物件而非型別。
未完待續……
多型,虛函式,純虛函式,抽象類
c 中,實現多型有以下方法 虛函式,抽象類,過載,覆蓋 多型性在object pascal和c 中都是通過虛函式 virtual function 實現的。這麼一大堆名詞,實際上就圍繞一件事展開,就是多型,其他三個名詞都是為實現c 的多型機制而提出的一些規則,下面分兩部分介紹,第一部分介紹 多型 第...
C 虛函式,多型性,純虛函式,抽象類
一 虛函式 1.用virtual關鍵字宣告的函式叫虛函式 虛函式標明在基類宣告的虛函式是虛擬的,並不是實際存在的函式,在派生類中才會正式定義此函式 虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式 eg class a class b p...
多型性 虛函式 抽象類
一 多型性 指相同物件收到不同訊息或不同物件收到相同訊息時產生不同的實現動作。c 支援兩種多型性 編譯時多型性,執行時多型性。1.編譯時多型性 通過過載函式實現 2.執行時多型性 通過虛函式實現。二 虛函式 虛函式是在基類中被宣告為virtual,並在派生類中重新定義的成員函式。可實現成員函式的動態...