C 多型及多型模型

2021-08-13 07:59:11 字數 1950 閱讀 8909

c++

多型及多型模型1)

虛函式:類的成員函式前面加上virtual關鍵字,則這個成員函式是虛函式;虛函式是存在**段的,虛函式的指標是存在虛表中的;(注意:必須是類的成員函式,靜態成員函式不能定義成虛函式)

2)重寫(覆蓋):在子類中定義了乙個和父類中完全相同的成員函式(函式名,引數,返回型別完全相同,但協變除外)

協變:子類和父類有同名且引數相同的函式,返回型別即:父類的返回型別為父類的指標或引用,子類的返回型別為子類的指標或引用;

重定義(隱藏):在子類中定義了乙個和父類同名的成員(成員變數,成員函式);這時在子類中要呼叫父類的此成員,需顯示呼叫;

過載:在同一作用域內,函式名相同,引數不同,返回型別可同可不同(根據平台確定,在windows平台上返回型別可以相同,在linux平台上返回型別不同);注意:c語言不支援函式過載

「多型」顧名思義「多種形態」;具體來講就是當用基類的指標或引用呼叫重寫的虛函式時,當指向的是父類物件時,呼叫的就是父類的虛函式,指向子類物件時,呼叫的就是父類的虛函式。

1、虛函式的重寫;

2、使用基類的指標或引用呼叫重寫的虛函式;

1、虛表:虛函式表是通過一塊連續記憶體來儲存虛函式的位址。這張表解決了繼承、虛函式(重寫)的問題。在有虛函式的物件例項中都存在一張虛函式表,虛函式表就像一張地圖,指明了實際應該呼叫的虛函式。

2、檢視虛表

由上圖可看出a物件中,有乙個_vfptr的指標陣列;便是a的虛表,裡面存了虛函式f1(),f2()的位址;

3、單繼承物件模型

4、多繼承物件模型

單繼承:乙個類只有乙個直接父類

多繼承:乙個類有兩個或兩個以上直接父類

class a

{public:

virtual void fun1()

{ cout<

1、子類重寫父類的虛函式,要求函式名,引數列表,返回型別完全相同(協變除外)

2、父類中定義了虛函式,在派生類中該函式始終保持虛函式的特性(即在子類該虛函式的virtual關鍵字可以省略,但最好寫上)

3、如果在類外定義虛函式,只能在宣告此函式時加virtual;

4、建構函式不能定義成虛函式(此時物件還不完整);

5、不要在建構函式和析構函式裡面呼叫虛函式,在建構函式和析構函式中,物件可能是不完整的,可能會出現未定義的行為;

6、最好將基類的析構函式定義成虛函式;(此時父類的析構函式和子類的析構函式構成重寫);

舉乙個例子說明這個問題:

#includeusing namespace std;

class a

{public:

a(){

cout<

在上面的**中,沒有將父類的析構函式定義成虛函式,當使用

delete

時,只呼叫了父類的析構函式,而沒有呼叫子類的析構函式,在上面的例子中,導致了記憶體洩漏;

而將父類的析構函式定義成虛函式時;

這樣便實現了多型,呼叫的是子類的析構函式(注意:子類的析構函式會自動呼叫父類的建構函式),這樣可以避免記憶體洩漏問題;

c 多型 多型物件模型

1.多型 在c 程式設計中,多型性是指具有不同功能的函式可以用同乙個函式名,這樣就可以用乙個函式名呼叫不同內容的函式。在物件導向方法中一般是這樣表述多型性的 向不同的物件傳送同乙個訊息,不同的物件在接收時會產生不同的行為 即方法 也就是說,每個物件可以用自己的方式去響應共同的訊息。所謂訊息,就是呼叫...

多型 多型物件模型

1 什麼多型?當使用基類的指標或引用呼叫重寫的虛函式時,指向父類調的就是父類的虛函式,指向子類調的就是子類的虛函式。下面我們來看一段 sizeof aa 的結果為什麼會是8呢?這是因為函式fun1是乙個虛函式,函式內部存在乙個虛表指標。單繼承物件模型 由於編譯器做了一定的優化,子類中自己定義的函式在...

多型 多型物件模型

一 什麼是多型。物件導向語言有三大特點,封裝 繼承 多型。今天就討論一下多型,多型是 當使用基類的指標或引用呼叫重寫的虛函式時,當指向父類呼叫的就是父類的虛函式,當指向子類就是呼叫子類的虛函式。多型 多種形態。多型分為靜態多型和動態多型。實現多型的其中乙個條件必須是要把子類給給父類,要構成is a的...