所謂多型,也就是說「多種形態」
c++中虛函式就是為了實現多型
虛函式–類的成員函式前面加上virtual關鍵字,則這個函式就是虛函式
多型的形成條件:
1、虛函式的重寫 2、父類的指標或者引用呼叫重寫的虛函式
例如:a*p = & b;
a是乙個父類,b是乙個子類物件
這個時候就是形成了多型。這個時候呼叫函式與型別無關,只與指向的物件有關,指向誰就呼叫誰。
虛函式的重寫:
當子類定義了乙個與父類完全相同的虛函式(返回值,引數同,函式名)時,則稱這個函式重寫
特例:協變 a類虛函式的返回值可定義為a類的指標或引用 b類也是可以定義為b類的。(可以看做是切片型別)
class a
}class b :public a
//在這裡fun函式就構成了重寫,(協變)
}
單繼承:
在這裡要了解一下虛表:就是乙個儲存了虛函式的表
虛函式實現多型的原因就是因為有乙個虛表指標指向虛函式表,這樣就可以通過指標來找到虛函式
//列印虛表的函式
//單繼承,多繼承都會用
//32位平台下,指標是4個位元組,我們只需要把它取出來就能把虛函式的位址列印出來了
typedef
void(*v_func)();//這裡定義乙個函式指標
void printvtable(int vtable)
cout
<
}
單繼承的**:
class base
;class derive:public base
;int main()
單繼承的物件模型如下圖
多繼承
class base1
菱形虛擬繼承物件模型如下圖所示:
在菱形虛擬繼承中:這裡既有虛函式表,又有虛基表,要理解,就需要在編譯**的時候自己看一下記憶體中的具體情況。如圖,可以看出,在菱形虛擬繼承中,把基類的儲存為公有的,這就需要用虛基錶用偏移量找到他。這裡注意虛函式的重寫,因為看的是derive的物件模型,所以在繼承的時候,有的函式進行了重寫。
c 多型 多型物件模型
1.多型 在c 程式設計中,多型性是指具有不同功能的函式可以用同乙個函式名,這樣就可以用乙個函式名呼叫不同內容的函式。在物件導向方法中一般是這樣表述多型性的 向不同的物件傳送同乙個訊息,不同的物件在接收時會產生不同的行為 即方法 也就是說,每個物件可以用自己的方式去響應共同的訊息。所謂訊息,就是呼叫...
多型 多型物件模型
1 什麼多型?當使用基類的指標或引用呼叫重寫的虛函式時,指向父類調的就是父類的虛函式,指向子類調的就是子類的虛函式。下面我們來看一段 sizeof aa 的結果為什麼會是8呢?這是因為函式fun1是乙個虛函式,函式內部存在乙個虛表指標。單繼承物件模型 由於編譯器做了一定的優化,子類中自己定義的函式在...
多型 多型物件模型
一 什麼是多型。物件導向語言有三大特點,封裝 繼承 多型。今天就討論一下多型,多型是 當使用基類的指標或引用呼叫重寫的虛函式時,當指向父類呼叫的就是父類的虛函式,當指向子類就是呼叫子類的虛函式。多型 多種形態。多型分為靜態多型和動態多型。實現多型的其中乙個條件必須是要把子類給給父類,要構成is a的...