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的...