1.多型:
在c ++程式設計中,多型性是指具有不同功能的函式可以用同乙個函式名,這樣就可以用乙個函式名呼叫不同內容的函式。在物件導向方法中一般是這樣表述多型性的:向不同的物件傳送同乙個訊息, 不同的物件在接收時會產生不同的行為(即方法)。也就是說,每個物件可以用自己的方式去響應共同的訊息。所謂訊息,就是呼叫函式,不同的行為就是指不同的實現,即執行不同的函式。從系統實現的角度看,多型性分為兩類:靜態多型性和動態多型性。以前學過的函式過載和運算子過載實現的多型性屬於靜態多型性,在程式編譯時系統就能決定呼叫的是哪個函式,因此靜態多型性又稱編譯時的多型性。靜態多型性是通過函式的過載實現的(運算子過載實質上也是函式過載)。動態多型性是在程式執行過程中才動態地確定操作所針對的物件。它又稱執行時的多型性。動態多型性是通過虛函式(virtual fiinction)實現的。
當使用基類的指標或引用呼叫重寫的虛函式時,當指向父類呼叫的就是父類的虛函式,當指向子類呼叫的就是子類的虛函式。 例:
class person //父類
protected:
string _name;
};class student :public person //子類
protected:
int _num; //學號
};void fun(person&p)
void test()
虛函式:類成員函式前加virtual
虛函式重寫:當在子類定義了乙個與父類完全相同的虛函式,則稱子類的這個函式重寫了父類這個函式。
2.多型的物件模型(單繼承&多繼承)
1.單繼承
可以看出派生類derive::fun1重寫基類base::fun1,覆蓋了相應虛表位置上的函式。
2.多繼承
記憶體布局:
3.菱形繼承
什麼是菱形繼承?通過這個圖大家就可以很直觀的理解啦
如上圖,菱形繼承即多個類繼承了同乙個公共基類,而這些派生類又同時被乙個類繼承。這麼做會引發什麼問題呢?
通過該**,我們可以看出當我們想要呼叫我們從base裡繼承的fun時就會出現
呼叫不明確
問題,並且會造成資料冗餘的問題。
我們可以使用域限定我們所要訪問的函式,c++也給我們了另乙個解決方案--虛繼承。
多型 多型物件模型
1 什麼多型?當使用基類的指標或引用呼叫重寫的虛函式時,指向父類調的就是父類的虛函式,指向子類調的就是子類的虛函式。下面我們來看一段 sizeof aa 的結果為什麼會是8呢?這是因為函式fun1是乙個虛函式,函式內部存在乙個虛表指標。單繼承物件模型 由於編譯器做了一定的優化,子類中自己定義的函式在...
多型 多型物件模型
一 什麼是多型。物件導向語言有三大特點,封裝 繼承 多型。今天就討論一下多型,多型是 當使用基類的指標或引用呼叫重寫的虛函式時,當指向父類呼叫的就是父類的虛函式,當指向子類就是呼叫子類的虛函式。多型 多種形態。多型分為靜態多型和動態多型。實現多型的其中乙個條件必須是要把子類給給父類,要構成is a的...
多型 多型物件模型
理解多型 所謂多型,其實就是多種 形態 c 中虛函式的主要作用就是實現多型,簡單說父類的指標 引用呼叫重寫的虛函式,當父類指標 引用指向父類物件時呼叫的是父類的虛函式,指向子類物件時呼叫的是子類的虛函式。類別 1 編譯時的多型性。編譯時的多型性是通過過載來實現的。對於非虛的成員來說,系統在編譯時,根...