c++中的多型分為靜多型和動多型兩種情況。
靜多型是在編譯時就能確定呼叫函式的型別,包括過載和模板。動多型則是需要在執行時才能確定呼叫哪乙個函式。
動多型的產生條件是需要在基類的指標指向派生類的物件,並呼叫派生類的函式。而要想呼叫派生類的函式,那麼基類裡這個函式應寫為虛函式。什麼是虛函式?所謂的虛函式就是允許子類對其重新的定義,這種稱之為覆蓋。
當基類寫了虛函式時便會有虛函式指標(vptr)和虛函式表,在他的類物件記憶體前面會多出四位元組大小,這裡來存放虛函式指標,虛函式指標來指向虛函式表,所謂的虛函式表就是用來存放著所有虛函式的位置,由於其動態繫結特性,在覆寫後在子類中儲存的虛函式位置與父類中不相同。
當子類重新定義了父類的虛函式後,父類指標根據賦給它的不同的子類指標,動態的呼叫屬於子類的該函式,這樣的函式呼叫在編譯期間是無法確定的,執行時才能獲取虛函式指標vptr和根據虛函式表的偏移量確定實際函式位址。
class animal
virtual void call()
virtual ~animal()
private:
string _name;
};class cat : public animal
void call()
~cat()
private:
string _name;
};class dog : public animal
void call()
~dog()
private:
string _name;
};
這裡基類是animal類,派生類為cat和dog類。
int main()
在執行這樣的程式之後的結果為
這樣就產生了多型,呼叫同乙個函式call()但是產生了不同的結果。
在c++中還有乙個特點,
c++裡規定,為了防止記憶體洩漏。當你在基類的建構函式中申請了資源的時候,派生類繼承了基類,也就基礎了基類的建構函式。所以析構的時候也要呼叫基類的析構函式。但是要注意一定要將基類中的析構函式寫成虛函式,因為如果這個類被其他類繼承但並沒有把析構函式寫成虛函式,若定義乙個父類的指標指向子類,當釋放這個指標時的過程是:只是釋放了父類的資源,而沒有呼叫繼承類的析構函式,造成記憶體洩漏.。
構造和析構的順序是相反的。
構造時,基類先構造,然後再派生類。析構時則反過來。先呼叫派生類的析構,再呼叫基類的析構。這符合資源棧的操作。先進後出,先申請的資源後釋放。 舉個例子:
C 多型及實現
c 的多型性用一句話概括就是 在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。如果物件型別是派生類,就呼叫派生類的函式 如果物件型別是基類,就呼叫基類的函式 1 用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2 存在...
C 中多型的實現
物件導向語言的主要特點是 封裝性 繼承性 多型性。其中,封裝性使得 模組化,繼承性完成 的復用,多型實現介面的重用。在c 中,多型性是指具有不同功能的函式用同乙個函式名。即用同乙個函式名,呼叫不同內容的函式。下面主要從多型的實現分析c 中的多型。多型的實現有兩種方式 靜態聯編和動態聯編。系統在編譯的...
C 多型的實現及原理
c 的多型性用一句話概括就是 在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。如果物件型別是派生類,就呼叫派生類的函式 如果物件型別是基類,就呼叫基類的函式 1 用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2 存在...